Tweak
[official-gcc.git] / libiberty / cp-demangle.c
blobc3300528ff024de388f15d012a1549300ab7ce5b
1 /* Demangler for g++ V3 ABI.
2 Copyright (C) 2003-2017 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 http://www.codesourcery.com/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 *, int);
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 *, int);
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_FUNCTION_PARAM:
629 printf ("function parameter %ld\n", dc->u.s_number.number);
630 return;
631 case DEMANGLE_COMPONENT_CTOR:
632 printf ("constructor %d\n", (int) dc->u.s_ctor.kind);
633 d_dump (dc->u.s_ctor.name, indent + 2);
634 return;
635 case DEMANGLE_COMPONENT_DTOR:
636 printf ("destructor %d\n", (int) dc->u.s_dtor.kind);
637 d_dump (dc->u.s_dtor.name, indent + 2);
638 return;
639 case DEMANGLE_COMPONENT_SUB_STD:
640 printf ("standard substitution %s\n", dc->u.s_string.string);
641 return;
642 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
643 printf ("builtin type %s\n", dc->u.s_builtin.type->name);
644 return;
645 case DEMANGLE_COMPONENT_OPERATOR:
646 printf ("operator %s\n", dc->u.s_operator.op->name);
647 return;
648 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
649 printf ("extended operator with %d args\n",
650 dc->u.s_extended_operator.args);
651 d_dump (dc->u.s_extended_operator.name, indent + 2);
652 return;
654 case DEMANGLE_COMPONENT_QUAL_NAME:
655 printf ("qualified name\n");
656 break;
657 case DEMANGLE_COMPONENT_LOCAL_NAME:
658 printf ("local name\n");
659 break;
660 case DEMANGLE_COMPONENT_TYPED_NAME:
661 printf ("typed name\n");
662 break;
663 case DEMANGLE_COMPONENT_TEMPLATE:
664 printf ("template\n");
665 break;
666 case DEMANGLE_COMPONENT_VTABLE:
667 printf ("vtable\n");
668 break;
669 case DEMANGLE_COMPONENT_VTT:
670 printf ("VTT\n");
671 break;
672 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
673 printf ("construction vtable\n");
674 break;
675 case DEMANGLE_COMPONENT_TYPEINFO:
676 printf ("typeinfo\n");
677 break;
678 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
679 printf ("typeinfo name\n");
680 break;
681 case DEMANGLE_COMPONENT_TYPEINFO_FN:
682 printf ("typeinfo function\n");
683 break;
684 case DEMANGLE_COMPONENT_THUNK:
685 printf ("thunk\n");
686 break;
687 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
688 printf ("virtual thunk\n");
689 break;
690 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
691 printf ("covariant thunk\n");
692 break;
693 case DEMANGLE_COMPONENT_JAVA_CLASS:
694 printf ("java class\n");
695 break;
696 case DEMANGLE_COMPONENT_GUARD:
697 printf ("guard\n");
698 break;
699 case DEMANGLE_COMPONENT_REFTEMP:
700 printf ("reference temporary\n");
701 break;
702 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
703 printf ("hidden alias\n");
704 break;
705 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
706 printf ("transaction clone\n");
707 break;
708 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
709 printf ("non-transaction clone\n");
710 break;
711 case DEMANGLE_COMPONENT_RESTRICT:
712 printf ("restrict\n");
713 break;
714 case DEMANGLE_COMPONENT_VOLATILE:
715 printf ("volatile\n");
716 break;
717 case DEMANGLE_COMPONENT_CONST:
718 printf ("const\n");
719 break;
720 case DEMANGLE_COMPONENT_RESTRICT_THIS:
721 printf ("restrict this\n");
722 break;
723 case DEMANGLE_COMPONENT_VOLATILE_THIS:
724 printf ("volatile this\n");
725 break;
726 case DEMANGLE_COMPONENT_CONST_THIS:
727 printf ("const this\n");
728 break;
729 case DEMANGLE_COMPONENT_REFERENCE_THIS:
730 printf ("reference this\n");
731 break;
732 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
733 printf ("rvalue reference this\n");
734 break;
735 case DEMANGLE_COMPONENT_TRANSACTION_SAFE:
736 printf ("transaction_safe this\n");
737 break;
738 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
739 printf ("vendor type qualifier\n");
740 break;
741 case DEMANGLE_COMPONENT_POINTER:
742 printf ("pointer\n");
743 break;
744 case DEMANGLE_COMPONENT_REFERENCE:
745 printf ("reference\n");
746 break;
747 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
748 printf ("rvalue reference\n");
749 break;
750 case DEMANGLE_COMPONENT_COMPLEX:
751 printf ("complex\n");
752 break;
753 case DEMANGLE_COMPONENT_IMAGINARY:
754 printf ("imaginary\n");
755 break;
756 case DEMANGLE_COMPONENT_VENDOR_TYPE:
757 printf ("vendor type\n");
758 break;
759 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
760 printf ("function type\n");
761 break;
762 case DEMANGLE_COMPONENT_ARRAY_TYPE:
763 printf ("array type\n");
764 break;
765 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
766 printf ("pointer to member type\n");
767 break;
768 case DEMANGLE_COMPONENT_FIXED_TYPE:
769 printf ("fixed-point type, accum? %d, sat? %d\n",
770 dc->u.s_fixed.accum, dc->u.s_fixed.sat);
771 d_dump (dc->u.s_fixed.length, indent + 2);
772 break;
773 case DEMANGLE_COMPONENT_ARGLIST:
774 printf ("argument list\n");
775 break;
776 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
777 printf ("template argument list\n");
778 break;
779 case DEMANGLE_COMPONENT_INITIALIZER_LIST:
780 printf ("initializer list\n");
781 break;
782 case DEMANGLE_COMPONENT_CAST:
783 printf ("cast\n");
784 break;
785 case DEMANGLE_COMPONENT_CONVERSION:
786 printf ("conversion operator\n");
787 break;
788 case DEMANGLE_COMPONENT_NULLARY:
789 printf ("nullary operator\n");
790 break;
791 case DEMANGLE_COMPONENT_UNARY:
792 printf ("unary operator\n");
793 break;
794 case DEMANGLE_COMPONENT_BINARY:
795 printf ("binary operator\n");
796 break;
797 case DEMANGLE_COMPONENT_BINARY_ARGS:
798 printf ("binary operator arguments\n");
799 break;
800 case DEMANGLE_COMPONENT_TRINARY:
801 printf ("trinary operator\n");
802 break;
803 case DEMANGLE_COMPONENT_TRINARY_ARG1:
804 printf ("trinary operator arguments 1\n");
805 break;
806 case DEMANGLE_COMPONENT_TRINARY_ARG2:
807 printf ("trinary operator arguments 1\n");
808 break;
809 case DEMANGLE_COMPONENT_LITERAL:
810 printf ("literal\n");
811 break;
812 case DEMANGLE_COMPONENT_LITERAL_NEG:
813 printf ("negative literal\n");
814 break;
815 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
816 printf ("java resource\n");
817 break;
818 case DEMANGLE_COMPONENT_COMPOUND_NAME:
819 printf ("compound name\n");
820 break;
821 case DEMANGLE_COMPONENT_CHARACTER:
822 printf ("character '%c'\n", dc->u.s_character.character);
823 return;
824 case DEMANGLE_COMPONENT_NUMBER:
825 printf ("number %ld\n", dc->u.s_number.number);
826 return;
827 case DEMANGLE_COMPONENT_DECLTYPE:
828 printf ("decltype\n");
829 break;
830 case DEMANGLE_COMPONENT_PACK_EXPANSION:
831 printf ("pack expansion\n");
832 break;
833 case DEMANGLE_COMPONENT_TLS_INIT:
834 printf ("tls init function\n");
835 break;
836 case DEMANGLE_COMPONENT_TLS_WRAPPER:
837 printf ("tls wrapper function\n");
838 break;
839 case DEMANGLE_COMPONENT_DEFAULT_ARG:
840 printf ("default argument %d\n", dc->u.s_unary_num.num);
841 d_dump (dc->u.s_unary_num.sub, indent+2);
842 return;
843 case DEMANGLE_COMPONENT_LAMBDA:
844 printf ("lambda %d\n", dc->u.s_unary_num.num);
845 d_dump (dc->u.s_unary_num.sub, indent+2);
846 return;
849 d_dump (d_left (dc), indent + 2);
850 d_dump (d_right (dc), indent + 2);
853 #endif /* CP_DEMANGLE_DEBUG */
855 /* Fill in a DEMANGLE_COMPONENT_NAME. */
857 CP_STATIC_IF_GLIBCPP_V3
859 cplus_demangle_fill_name (struct demangle_component *p, const char *s, int len)
861 if (p == NULL || s == NULL || len == 0)
862 return 0;
863 p->d_printing = 0;
864 p->type = DEMANGLE_COMPONENT_NAME;
865 p->u.s_name.s = s;
866 p->u.s_name.len = len;
867 return 1;
870 /* Fill in a DEMANGLE_COMPONENT_EXTENDED_OPERATOR. */
872 CP_STATIC_IF_GLIBCPP_V3
874 cplus_demangle_fill_extended_operator (struct demangle_component *p, int args,
875 struct demangle_component *name)
877 if (p == NULL || args < 0 || name == NULL)
878 return 0;
879 p->d_printing = 0;
880 p->type = DEMANGLE_COMPONENT_EXTENDED_OPERATOR;
881 p->u.s_extended_operator.args = args;
882 p->u.s_extended_operator.name = name;
883 return 1;
886 /* Fill in a DEMANGLE_COMPONENT_CTOR. */
888 CP_STATIC_IF_GLIBCPP_V3
890 cplus_demangle_fill_ctor (struct demangle_component *p,
891 enum gnu_v3_ctor_kinds kind,
892 struct demangle_component *name)
894 if (p == NULL
895 || name == NULL
896 || (int) kind < gnu_v3_complete_object_ctor
897 || (int) kind > gnu_v3_object_ctor_group)
898 return 0;
899 p->d_printing = 0;
900 p->type = DEMANGLE_COMPONENT_CTOR;
901 p->u.s_ctor.kind = kind;
902 p->u.s_ctor.name = name;
903 return 1;
906 /* Fill in a DEMANGLE_COMPONENT_DTOR. */
908 CP_STATIC_IF_GLIBCPP_V3
910 cplus_demangle_fill_dtor (struct demangle_component *p,
911 enum gnu_v3_dtor_kinds kind,
912 struct demangle_component *name)
914 if (p == NULL
915 || name == NULL
916 || (int) kind < gnu_v3_deleting_dtor
917 || (int) kind > gnu_v3_object_dtor_group)
918 return 0;
919 p->d_printing = 0;
920 p->type = DEMANGLE_COMPONENT_DTOR;
921 p->u.s_dtor.kind = kind;
922 p->u.s_dtor.name = name;
923 return 1;
926 /* Add a new component. */
928 static struct demangle_component *
929 d_make_empty (struct d_info *di)
931 struct demangle_component *p;
933 if (di->next_comp >= di->num_comps)
934 return NULL;
935 p = &di->comps[di->next_comp];
936 p->d_printing = 0;
937 ++di->next_comp;
938 return p;
941 /* Add a new generic component. */
943 static struct demangle_component *
944 d_make_comp (struct d_info *di, enum demangle_component_type type,
945 struct demangle_component *left,
946 struct demangle_component *right)
948 struct demangle_component *p;
950 /* We check for errors here. A typical error would be a NULL return
951 from a subroutine. We catch those here, and return NULL
952 upward. */
953 switch (type)
955 /* These types require two parameters. */
956 case DEMANGLE_COMPONENT_QUAL_NAME:
957 case DEMANGLE_COMPONENT_LOCAL_NAME:
958 case DEMANGLE_COMPONENT_TYPED_NAME:
959 case DEMANGLE_COMPONENT_TAGGED_NAME:
960 case DEMANGLE_COMPONENT_TEMPLATE:
961 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
962 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
963 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
964 case DEMANGLE_COMPONENT_UNARY:
965 case DEMANGLE_COMPONENT_BINARY:
966 case DEMANGLE_COMPONENT_BINARY_ARGS:
967 case DEMANGLE_COMPONENT_TRINARY:
968 case DEMANGLE_COMPONENT_TRINARY_ARG1:
969 case DEMANGLE_COMPONENT_LITERAL:
970 case DEMANGLE_COMPONENT_LITERAL_NEG:
971 case DEMANGLE_COMPONENT_COMPOUND_NAME:
972 case DEMANGLE_COMPONENT_VECTOR_TYPE:
973 case DEMANGLE_COMPONENT_CLONE:
974 if (left == NULL || right == NULL)
975 return NULL;
976 break;
978 /* These types only require one parameter. */
979 case DEMANGLE_COMPONENT_VTABLE:
980 case DEMANGLE_COMPONENT_VTT:
981 case DEMANGLE_COMPONENT_TYPEINFO:
982 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
983 case DEMANGLE_COMPONENT_TYPEINFO_FN:
984 case DEMANGLE_COMPONENT_THUNK:
985 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
986 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
987 case DEMANGLE_COMPONENT_JAVA_CLASS:
988 case DEMANGLE_COMPONENT_GUARD:
989 case DEMANGLE_COMPONENT_TLS_INIT:
990 case DEMANGLE_COMPONENT_TLS_WRAPPER:
991 case DEMANGLE_COMPONENT_REFTEMP:
992 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
993 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
994 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
995 case DEMANGLE_COMPONENT_POINTER:
996 case DEMANGLE_COMPONENT_REFERENCE:
997 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
998 case DEMANGLE_COMPONENT_COMPLEX:
999 case DEMANGLE_COMPONENT_IMAGINARY:
1000 case DEMANGLE_COMPONENT_VENDOR_TYPE:
1001 case DEMANGLE_COMPONENT_CAST:
1002 case DEMANGLE_COMPONENT_CONVERSION:
1003 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
1004 case DEMANGLE_COMPONENT_DECLTYPE:
1005 case DEMANGLE_COMPONENT_PACK_EXPANSION:
1006 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
1007 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
1008 case DEMANGLE_COMPONENT_NULLARY:
1009 case DEMANGLE_COMPONENT_TRINARY_ARG2:
1010 if (left == NULL)
1011 return NULL;
1012 break;
1014 /* This needs a right parameter, but the left parameter can be
1015 empty. */
1016 case DEMANGLE_COMPONENT_ARRAY_TYPE:
1017 case DEMANGLE_COMPONENT_INITIALIZER_LIST:
1018 if (right == NULL)
1019 return NULL;
1020 break;
1022 /* These are allowed to have no parameters--in some cases they
1023 will be filled in later. */
1024 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
1025 case DEMANGLE_COMPONENT_RESTRICT:
1026 case DEMANGLE_COMPONENT_VOLATILE:
1027 case DEMANGLE_COMPONENT_CONST:
1028 case DEMANGLE_COMPONENT_ARGLIST:
1029 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
1030 FNQUAL_COMPONENT_CASE:
1031 break;
1033 /* Other types should not be seen here. */
1034 default:
1035 return NULL;
1038 p = d_make_empty (di);
1039 if (p != NULL)
1041 p->type = type;
1042 p->u.s_binary.left = left;
1043 p->u.s_binary.right = right;
1045 return p;
1048 /* Add a new demangle mangled name component. */
1050 static struct demangle_component *
1051 d_make_demangle_mangled_name (struct d_info *di, const char *s)
1053 if (d_peek_char (di) != '_' || d_peek_next_char (di) != 'Z')
1054 return d_make_name (di, s, strlen (s));
1055 d_advance (di, 2);
1056 return d_encoding (di, 0);
1059 /* Add a new name component. */
1061 static struct demangle_component *
1062 d_make_name (struct d_info *di, const char *s, int len)
1064 struct demangle_component *p;
1066 p = d_make_empty (di);
1067 if (! cplus_demangle_fill_name (p, s, len))
1068 return NULL;
1069 return p;
1072 /* Add a new builtin type component. */
1074 static struct demangle_component *
1075 d_make_builtin_type (struct d_info *di,
1076 const struct demangle_builtin_type_info *type)
1078 struct demangle_component *p;
1080 if (type == NULL)
1081 return NULL;
1082 p = d_make_empty (di);
1083 if (p != NULL)
1085 p->type = DEMANGLE_COMPONENT_BUILTIN_TYPE;
1086 p->u.s_builtin.type = type;
1088 return p;
1091 /* Add a new operator component. */
1093 static struct demangle_component *
1094 d_make_operator (struct d_info *di, const struct demangle_operator_info *op)
1096 struct demangle_component *p;
1098 p = d_make_empty (di);
1099 if (p != NULL)
1101 p->type = DEMANGLE_COMPONENT_OPERATOR;
1102 p->u.s_operator.op = op;
1104 return p;
1107 /* Add a new extended operator component. */
1109 static struct demangle_component *
1110 d_make_extended_operator (struct d_info *di, int args,
1111 struct demangle_component *name)
1113 struct demangle_component *p;
1115 p = d_make_empty (di);
1116 if (! cplus_demangle_fill_extended_operator (p, args, name))
1117 return NULL;
1118 return p;
1121 static struct demangle_component *
1122 d_make_default_arg (struct d_info *di, int num,
1123 struct demangle_component *sub)
1125 struct demangle_component *p = d_make_empty (di);
1126 if (p)
1128 p->type = DEMANGLE_COMPONENT_DEFAULT_ARG;
1129 p->u.s_unary_num.num = num;
1130 p->u.s_unary_num.sub = sub;
1132 return p;
1135 /* Add a new constructor component. */
1137 static struct demangle_component *
1138 d_make_ctor (struct d_info *di, enum gnu_v3_ctor_kinds kind,
1139 struct demangle_component *name)
1141 struct demangle_component *p;
1143 p = d_make_empty (di);
1144 if (! cplus_demangle_fill_ctor (p, kind, name))
1145 return NULL;
1146 return p;
1149 /* Add a new destructor component. */
1151 static struct demangle_component *
1152 d_make_dtor (struct d_info *di, enum gnu_v3_dtor_kinds kind,
1153 struct demangle_component *name)
1155 struct demangle_component *p;
1157 p = d_make_empty (di);
1158 if (! cplus_demangle_fill_dtor (p, kind, name))
1159 return NULL;
1160 return p;
1163 /* Add a new template parameter. */
1165 static struct demangle_component *
1166 d_make_template_param (struct d_info *di, int i)
1168 struct demangle_component *p;
1170 p = d_make_empty (di);
1171 if (p != NULL)
1173 p->type = DEMANGLE_COMPONENT_TEMPLATE_PARAM;
1174 p->u.s_number.number = i;
1176 return p;
1179 /* Add a new function parameter. */
1181 static struct demangle_component *
1182 d_make_function_param (struct d_info *di, int i)
1184 struct demangle_component *p;
1186 p = d_make_empty (di);
1187 if (p != NULL)
1189 p->type = DEMANGLE_COMPONENT_FUNCTION_PARAM;
1190 p->u.s_number.number = i;
1192 return p;
1195 /* Add a new standard substitution component. */
1197 static struct demangle_component *
1198 d_make_sub (struct d_info *di, const char *name, int len)
1200 struct demangle_component *p;
1202 p = d_make_empty (di);
1203 if (p != NULL)
1205 p->type = DEMANGLE_COMPONENT_SUB_STD;
1206 p->u.s_string.string = name;
1207 p->u.s_string.len = len;
1209 return p;
1212 /* <mangled-name> ::= _Z <encoding> [<clone-suffix>]*
1214 TOP_LEVEL is non-zero when called at the top level. */
1216 CP_STATIC_IF_GLIBCPP_V3
1217 struct demangle_component *
1218 cplus_demangle_mangled_name (struct d_info *di, int top_level)
1220 struct demangle_component *p;
1222 if (! d_check_char (di, '_')
1223 /* Allow missing _ if not at toplevel to work around a
1224 bug in G++ abi-version=2 mangling; see the comment in
1225 write_template_arg. */
1226 && top_level)
1227 return NULL;
1228 if (! d_check_char (di, 'Z'))
1229 return NULL;
1230 p = d_encoding (di, top_level);
1232 /* If at top level and parsing parameters, check for a clone
1233 suffix. */
1234 if (top_level && (di->options & DMGL_PARAMS) != 0)
1235 while (d_peek_char (di) == '.'
1236 && (IS_LOWER (d_peek_next_char (di))
1237 || d_peek_next_char (di) == '_'
1238 || IS_DIGIT (d_peek_next_char (di))))
1239 p = d_clone_suffix (di, p);
1241 return p;
1244 /* Return whether a function should have a return type. The argument
1245 is the function name, which may be qualified in various ways. The
1246 rules are that template functions have return types with some
1247 exceptions, function types which are not part of a function name
1248 mangling have return types with some exceptions, and non-template
1249 function names do not have return types. The exceptions are that
1250 constructors, destructors, and conversion operators do not have
1251 return types. */
1253 static int
1254 has_return_type (struct demangle_component *dc)
1256 if (dc == NULL)
1257 return 0;
1258 switch (dc->type)
1260 default:
1261 return 0;
1262 case DEMANGLE_COMPONENT_TEMPLATE:
1263 return ! is_ctor_dtor_or_conversion (d_left (dc));
1264 FNQUAL_COMPONENT_CASE:
1265 return has_return_type (d_left (dc));
1269 /* Return whether a name is a constructor, a destructor, or a
1270 conversion operator. */
1272 static int
1273 is_ctor_dtor_or_conversion (struct demangle_component *dc)
1275 if (dc == NULL)
1276 return 0;
1277 switch (dc->type)
1279 default:
1280 return 0;
1281 case DEMANGLE_COMPONENT_QUAL_NAME:
1282 case DEMANGLE_COMPONENT_LOCAL_NAME:
1283 return is_ctor_dtor_or_conversion (d_right (dc));
1284 case DEMANGLE_COMPONENT_CTOR:
1285 case DEMANGLE_COMPONENT_DTOR:
1286 case DEMANGLE_COMPONENT_CONVERSION:
1287 return 1;
1291 /* <encoding> ::= <(function) name> <bare-function-type>
1292 ::= <(data) name>
1293 ::= <special-name>
1295 TOP_LEVEL is non-zero when called at the top level, in which case
1296 if DMGL_PARAMS is not set we do not demangle the function
1297 parameters. We only set this at the top level, because otherwise
1298 we would not correctly demangle names in local scopes. */
1300 static struct demangle_component *
1301 d_encoding (struct d_info *di, int top_level)
1303 char peek = d_peek_char (di);
1305 if (peek == 'G' || peek == 'T')
1306 return d_special_name (di);
1307 else
1309 struct demangle_component *dc, *dcr;
1311 dc = d_name (di, top_level);
1313 if (dc != NULL && top_level && (di->options & DMGL_PARAMS) == 0)
1315 /* Strip off any initial CV-qualifiers, as they really apply
1316 to the `this' parameter, and they were not output by the
1317 v2 demangler without DMGL_PARAMS. */
1318 while (dc->type == DEMANGLE_COMPONENT_RESTRICT_THIS
1319 || dc->type == DEMANGLE_COMPONENT_VOLATILE_THIS
1320 || dc->type == DEMANGLE_COMPONENT_CONST_THIS
1321 || dc->type == DEMANGLE_COMPONENT_REFERENCE_THIS
1322 || dc->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS)
1323 dc = d_left (dc);
1325 /* If the top level is a DEMANGLE_COMPONENT_LOCAL_NAME, then
1326 there may be function-qualifiers on its right argument which
1327 really apply here; this happens when parsing a class
1328 which is local to a function. */
1329 if (dc->type == DEMANGLE_COMPONENT_LOCAL_NAME)
1331 dcr = d_right (dc);
1332 while (is_fnqual_component_type (dcr->type))
1333 dcr = d_left (dcr);
1334 dc->u.s_binary.right = dcr;
1337 return dc;
1340 peek = d_peek_char (di);
1341 if (dc == NULL || peek == '\0' || peek == 'E')
1342 return dc;
1343 dcr = d_bare_function_type (di, has_return_type (dc));
1344 return d_make_comp (di, DEMANGLE_COMPONENT_TYPED_NAME, dc, dcr);
1348 /* <tagged-name> ::= <name> B <source-name> */
1350 static struct demangle_component *
1351 d_abi_tags (struct d_info *di, struct demangle_component *dc)
1353 struct demangle_component *hold_last_name;
1354 char peek;
1356 /* Preserve the last name, so the ABI tag doesn't clobber it. */
1357 hold_last_name = di->last_name;
1359 while (peek = d_peek_char (di),
1360 peek == 'B')
1362 struct demangle_component *tag;
1363 d_advance (di, 1);
1364 tag = d_source_name (di);
1365 dc = d_make_comp (di, DEMANGLE_COMPONENT_TAGGED_NAME, dc, tag);
1368 di->last_name = hold_last_name;
1370 return dc;
1373 /* <name> ::= <nested-name>
1374 ::= <unscoped-name>
1375 ::= <unscoped-template-name> <template-args>
1376 ::= <local-name>
1378 <unscoped-name> ::= <unqualified-name>
1379 ::= St <unqualified-name>
1381 <unscoped-template-name> ::= <unscoped-name>
1382 ::= <substitution>
1385 static struct demangle_component *
1386 d_name (struct d_info *di, int top_level)
1388 char peek = d_peek_char (di);
1389 struct demangle_component *dc;
1391 switch (peek)
1393 case 'N':
1394 return d_nested_name (di);
1396 case 'Z':
1397 return d_local_name (di, top_level);
1399 case 'U':
1400 return d_unqualified_name (di);
1402 case 'S':
1404 int subst;
1406 if (d_peek_next_char (di) != 't')
1408 dc = d_substitution (di, 0);
1409 subst = 1;
1411 else
1413 d_advance (di, 2);
1414 dc = d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME,
1415 d_make_name (di, "std", 3),
1416 d_unqualified_name (di));
1417 di->expansion += 3;
1418 subst = 0;
1421 if (d_peek_char (di) != 'I')
1423 /* The grammar does not permit this case to occur if we
1424 called d_substitution() above (i.e., subst == 1). We
1425 don't bother to check. */
1427 else
1429 /* This is <template-args>, which means that we just saw
1430 <unscoped-template-name>, which is a substitution
1431 candidate if we didn't just get it from a
1432 substitution. */
1433 if (! subst)
1435 if (! d_add_substitution (di, dc))
1436 return NULL;
1438 dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc,
1439 d_template_args (di));
1442 return dc;
1445 case 'L':
1446 default:
1447 dc = d_unqualified_name (di);
1448 if (d_peek_char (di) == 'I')
1450 /* This is <template-args>, which means that we just saw
1451 <unscoped-template-name>, which is a substitution
1452 candidate. */
1453 if (! d_add_substitution (di, dc))
1454 return NULL;
1455 dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc,
1456 d_template_args (di));
1458 return dc;
1462 /* <nested-name> ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E
1463 ::= N [<CV-qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E
1466 static struct demangle_component *
1467 d_nested_name (struct d_info *di)
1469 struct demangle_component *ret;
1470 struct demangle_component **pret;
1471 struct demangle_component *rqual;
1473 if (! d_check_char (di, 'N'))
1474 return NULL;
1476 pret = d_cv_qualifiers (di, &ret, 1);
1477 if (pret == NULL)
1478 return NULL;
1480 /* Parse the ref-qualifier now and then attach it
1481 once we have something to attach it to. */
1482 rqual = d_ref_qualifier (di, NULL);
1484 *pret = d_prefix (di);
1485 if (*pret == NULL)
1486 return NULL;
1488 if (rqual)
1490 d_left (rqual) = ret;
1491 ret = rqual;
1494 if (! d_check_char (di, 'E'))
1495 return NULL;
1497 return ret;
1500 /* <prefix> ::= <prefix> <unqualified-name>
1501 ::= <template-prefix> <template-args>
1502 ::= <template-param>
1503 ::= <decltype>
1505 ::= <substitution>
1507 <template-prefix> ::= <prefix> <(template) unqualified-name>
1508 ::= <template-param>
1509 ::= <substitution>
1512 static struct demangle_component *
1513 d_prefix (struct d_info *di)
1515 struct demangle_component *ret = NULL;
1517 while (1)
1519 char peek;
1520 enum demangle_component_type comb_type;
1521 struct demangle_component *dc;
1523 peek = d_peek_char (di);
1524 if (peek == '\0')
1525 return NULL;
1527 /* The older code accepts a <local-name> here, but I don't see
1528 that in the grammar. The older code does not accept a
1529 <template-param> here. */
1531 comb_type = DEMANGLE_COMPONENT_QUAL_NAME;
1532 if (peek == 'D')
1534 char peek2 = d_peek_next_char (di);
1535 if (peek2 == 'T' || peek2 == 't')
1536 /* Decltype. */
1537 dc = cplus_demangle_type (di);
1538 else
1539 /* Destructor name. */
1540 dc = d_unqualified_name (di);
1542 else if (IS_DIGIT (peek)
1543 || IS_LOWER (peek)
1544 || peek == 'C'
1545 || peek == 'U'
1546 || peek == 'L')
1547 dc = d_unqualified_name (di);
1548 else if (peek == 'S')
1549 dc = d_substitution (di, 1);
1550 else if (peek == 'I')
1552 if (ret == NULL)
1553 return NULL;
1554 comb_type = DEMANGLE_COMPONENT_TEMPLATE;
1555 dc = d_template_args (di);
1557 else if (peek == 'T')
1558 dc = d_template_param (di);
1559 else if (peek == 'E')
1560 return ret;
1561 else if (peek == 'M')
1563 /* Initializer scope for a lambda. We don't need to represent
1564 this; the normal code will just treat the variable as a type
1565 scope, which gives appropriate output. */
1566 if (ret == NULL)
1567 return NULL;
1568 d_advance (di, 1);
1569 continue;
1571 else
1572 return NULL;
1574 if (ret == NULL)
1575 ret = dc;
1576 else
1577 ret = d_make_comp (di, comb_type, ret, dc);
1579 if (peek != 'S' && d_peek_char (di) != 'E')
1581 if (! d_add_substitution (di, ret))
1582 return NULL;
1587 /* <unqualified-name> ::= <operator-name>
1588 ::= <ctor-dtor-name>
1589 ::= <source-name>
1590 ::= <local-source-name>
1592 <local-source-name> ::= L <source-name> <discriminator>
1595 static struct demangle_component *
1596 d_unqualified_name (struct d_info *di)
1598 struct demangle_component *ret;
1599 char peek;
1601 peek = d_peek_char (di);
1602 if (IS_DIGIT (peek))
1603 ret = d_source_name (di);
1604 else if (IS_LOWER (peek))
1606 if (peek == 'o' && d_peek_next_char (di) == 'n')
1607 d_advance (di, 2);
1608 ret = d_operator_name (di);
1609 if (ret != NULL && ret->type == DEMANGLE_COMPONENT_OPERATOR)
1611 di->expansion += sizeof "operator" + ret->u.s_operator.op->len - 2;
1612 if (!strcmp (ret->u.s_operator.op->code, "li"))
1613 ret = d_make_comp (di, DEMANGLE_COMPONENT_UNARY, ret,
1614 d_source_name (di));
1617 else if (peek == 'C' || peek == 'D')
1618 ret = d_ctor_dtor_name (di);
1619 else if (peek == 'L')
1621 d_advance (di, 1);
1623 ret = d_source_name (di);
1624 if (ret == NULL)
1625 return NULL;
1626 if (! d_discriminator (di))
1627 return NULL;
1629 else if (peek == 'U')
1631 switch (d_peek_next_char (di))
1633 case 'l':
1634 ret = d_lambda (di);
1635 break;
1636 case 't':
1637 ret = d_unnamed_type (di);
1638 break;
1639 default:
1640 return NULL;
1643 else
1644 return NULL;
1646 if (d_peek_char (di) == 'B')
1647 ret = d_abi_tags (di, ret);
1648 return ret;
1651 /* <source-name> ::= <(positive length) number> <identifier> */
1653 static struct demangle_component *
1654 d_source_name (struct d_info *di)
1656 int len;
1657 struct demangle_component *ret;
1659 len = d_number (di);
1660 if (len <= 0)
1661 return NULL;
1662 ret = d_identifier (di, len);
1663 di->last_name = ret;
1664 return ret;
1667 /* number ::= [n] <(non-negative decimal integer)> */
1669 static int
1670 d_number (struct d_info *di)
1672 int negative;
1673 char peek;
1674 int ret;
1676 negative = 0;
1677 peek = d_peek_char (di);
1678 if (peek == 'n')
1680 negative = 1;
1681 d_advance (di, 1);
1682 peek = d_peek_char (di);
1685 ret = 0;
1686 while (1)
1688 if (! IS_DIGIT (peek))
1690 if (negative)
1691 ret = - ret;
1692 return ret;
1694 if (ret > ((INT_MAX - (peek - '0')) / 10))
1695 return -1;
1696 ret = ret * 10 + peek - '0';
1697 d_advance (di, 1);
1698 peek = d_peek_char (di);
1702 /* Like d_number, but returns a demangle_component. */
1704 static struct demangle_component *
1705 d_number_component (struct d_info *di)
1707 struct demangle_component *ret = d_make_empty (di);
1708 if (ret)
1710 ret->type = DEMANGLE_COMPONENT_NUMBER;
1711 ret->u.s_number.number = d_number (di);
1713 return ret;
1716 /* identifier ::= <(unqualified source code identifier)> */
1718 static struct demangle_component *
1719 d_identifier (struct d_info *di, int len)
1721 const char *name;
1723 name = d_str (di);
1725 if (di->send - name < len)
1726 return NULL;
1728 d_advance (di, len);
1730 /* A Java mangled name may have a trailing '$' if it is a C++
1731 keyword. This '$' is not included in the length count. We just
1732 ignore the '$'. */
1733 if ((di->options & DMGL_JAVA) != 0
1734 && d_peek_char (di) == '$')
1735 d_advance (di, 1);
1737 /* Look for something which looks like a gcc encoding of an
1738 anonymous namespace, and replace it with a more user friendly
1739 name. */
1740 if (len >= (int) ANONYMOUS_NAMESPACE_PREFIX_LEN + 2
1741 && memcmp (name, ANONYMOUS_NAMESPACE_PREFIX,
1742 ANONYMOUS_NAMESPACE_PREFIX_LEN) == 0)
1744 const char *s;
1746 s = name + ANONYMOUS_NAMESPACE_PREFIX_LEN;
1747 if ((*s == '.' || *s == '_' || *s == '$')
1748 && s[1] == 'N')
1750 di->expansion -= len - sizeof "(anonymous namespace)";
1751 return d_make_name (di, "(anonymous namespace)",
1752 sizeof "(anonymous namespace)" - 1);
1756 return d_make_name (di, name, len);
1759 /* operator_name ::= many different two character encodings.
1760 ::= cv <type>
1761 ::= v <digit> <source-name>
1763 This list is sorted for binary search. */
1765 #define NL(s) s, (sizeof s) - 1
1767 CP_STATIC_IF_GLIBCPP_V3
1768 const struct demangle_operator_info cplus_demangle_operators[] =
1770 { "aN", NL ("&="), 2 },
1771 { "aS", NL ("="), 2 },
1772 { "aa", NL ("&&"), 2 },
1773 { "ad", NL ("&"), 1 },
1774 { "an", NL ("&"), 2 },
1775 { "at", NL ("alignof "), 1 },
1776 { "az", NL ("alignof "), 1 },
1777 { "cc", NL ("const_cast"), 2 },
1778 { "cl", NL ("()"), 2 },
1779 { "cm", NL (","), 2 },
1780 { "co", NL ("~"), 1 },
1781 { "dV", NL ("/="), 2 },
1782 { "da", NL ("delete[] "), 1 },
1783 { "dc", NL ("dynamic_cast"), 2 },
1784 { "de", NL ("*"), 1 },
1785 { "dl", NL ("delete "), 1 },
1786 { "ds", NL (".*"), 2 },
1787 { "dt", NL ("."), 2 },
1788 { "dv", NL ("/"), 2 },
1789 { "eO", NL ("^="), 2 },
1790 { "eo", NL ("^"), 2 },
1791 { "eq", NL ("=="), 2 },
1792 { "fL", NL ("..."), 3 },
1793 { "fR", NL ("..."), 3 },
1794 { "fl", NL ("..."), 2 },
1795 { "fr", NL ("..."), 2 },
1796 { "ge", NL (">="), 2 },
1797 { "gs", NL ("::"), 1 },
1798 { "gt", NL (">"), 2 },
1799 { "ix", NL ("[]"), 2 },
1800 { "lS", NL ("<<="), 2 },
1801 { "le", NL ("<="), 2 },
1802 { "li", NL ("operator\"\" "), 1 },
1803 { "ls", NL ("<<"), 2 },
1804 { "lt", NL ("<"), 2 },
1805 { "mI", NL ("-="), 2 },
1806 { "mL", NL ("*="), 2 },
1807 { "mi", NL ("-"), 2 },
1808 { "ml", NL ("*"), 2 },
1809 { "mm", NL ("--"), 1 },
1810 { "na", NL ("new[]"), 3 },
1811 { "ne", NL ("!="), 2 },
1812 { "ng", NL ("-"), 1 },
1813 { "nt", NL ("!"), 1 },
1814 { "nw", NL ("new"), 3 },
1815 { "oR", NL ("|="), 2 },
1816 { "oo", NL ("||"), 2 },
1817 { "or", NL ("|"), 2 },
1818 { "pL", NL ("+="), 2 },
1819 { "pl", NL ("+"), 2 },
1820 { "pm", NL ("->*"), 2 },
1821 { "pp", NL ("++"), 1 },
1822 { "ps", NL ("+"), 1 },
1823 { "pt", NL ("->"), 2 },
1824 { "qu", NL ("?"), 3 },
1825 { "rM", NL ("%="), 2 },
1826 { "rS", NL (">>="), 2 },
1827 { "rc", NL ("reinterpret_cast"), 2 },
1828 { "rm", NL ("%"), 2 },
1829 { "rs", NL (">>"), 2 },
1830 { "sP", NL ("sizeof..."), 1 },
1831 { "sZ", NL ("sizeof..."), 1 },
1832 { "sc", NL ("static_cast"), 2 },
1833 { "st", NL ("sizeof "), 1 },
1834 { "sz", NL ("sizeof "), 1 },
1835 { "tr", NL ("throw"), 0 },
1836 { "tw", NL ("throw "), 1 },
1837 { NULL, NULL, 0, 0 }
1840 static struct demangle_component *
1841 d_operator_name (struct d_info *di)
1843 char c1;
1844 char c2;
1846 c1 = d_next_char (di);
1847 c2 = d_next_char (di);
1848 if (c1 == 'v' && IS_DIGIT (c2))
1849 return d_make_extended_operator (di, c2 - '0', d_source_name (di));
1850 else if (c1 == 'c' && c2 == 'v')
1852 struct demangle_component *type;
1853 int was_conversion = di->is_conversion;
1854 struct demangle_component *res;
1856 di->is_conversion = ! di->is_expression;
1857 type = cplus_demangle_type (di);
1858 if (di->is_conversion)
1859 res = d_make_comp (di, DEMANGLE_COMPONENT_CONVERSION, type, NULL);
1860 else
1861 res = d_make_comp (di, DEMANGLE_COMPONENT_CAST, type, NULL);
1862 di->is_conversion = was_conversion;
1863 return res;
1865 else
1867 /* LOW is the inclusive lower bound. */
1868 int low = 0;
1869 /* HIGH is the exclusive upper bound. We subtract one to ignore
1870 the sentinel at the end of the array. */
1871 int high = ((sizeof (cplus_demangle_operators)
1872 / sizeof (cplus_demangle_operators[0]))
1873 - 1);
1875 while (1)
1877 int i;
1878 const struct demangle_operator_info *p;
1880 i = low + (high - low) / 2;
1881 p = cplus_demangle_operators + i;
1883 if (c1 == p->code[0] && c2 == p->code[1])
1884 return d_make_operator (di, p);
1886 if (c1 < p->code[0] || (c1 == p->code[0] && c2 < p->code[1]))
1887 high = i;
1888 else
1889 low = i + 1;
1890 if (low == high)
1891 return NULL;
1896 static struct demangle_component *
1897 d_make_character (struct d_info *di, int c)
1899 struct demangle_component *p;
1900 p = d_make_empty (di);
1901 if (p != NULL)
1903 p->type = DEMANGLE_COMPONENT_CHARACTER;
1904 p->u.s_character.character = c;
1906 return p;
1909 static struct demangle_component *
1910 d_java_resource (struct d_info *di)
1912 struct demangle_component *p = NULL;
1913 struct demangle_component *next = NULL;
1914 int len, i;
1915 char c;
1916 const char *str;
1918 len = d_number (di);
1919 if (len <= 1)
1920 return NULL;
1922 /* Eat the leading '_'. */
1923 if (d_next_char (di) != '_')
1924 return NULL;
1925 len--;
1927 str = d_str (di);
1928 i = 0;
1930 while (len > 0)
1932 c = str[i];
1933 if (!c)
1934 return NULL;
1936 /* Each chunk is either a '$' escape... */
1937 if (c == '$')
1939 i++;
1940 switch (str[i++])
1942 case 'S':
1943 c = '/';
1944 break;
1945 case '_':
1946 c = '.';
1947 break;
1948 case '$':
1949 c = '$';
1950 break;
1951 default:
1952 return NULL;
1954 next = d_make_character (di, c);
1955 d_advance (di, i);
1956 str = d_str (di);
1957 len -= i;
1958 i = 0;
1959 if (next == NULL)
1960 return NULL;
1962 /* ... or a sequence of characters. */
1963 else
1965 while (i < len && str[i] && str[i] != '$')
1966 i++;
1968 next = d_make_name (di, str, i);
1969 d_advance (di, i);
1970 str = d_str (di);
1971 len -= i;
1972 i = 0;
1973 if (next == NULL)
1974 return NULL;
1977 if (p == NULL)
1978 p = next;
1979 else
1981 p = d_make_comp (di, DEMANGLE_COMPONENT_COMPOUND_NAME, p, next);
1982 if (p == NULL)
1983 return NULL;
1987 p = d_make_comp (di, DEMANGLE_COMPONENT_JAVA_RESOURCE, p, NULL);
1989 return p;
1992 /* <special-name> ::= TV <type>
1993 ::= TT <type>
1994 ::= TI <type>
1995 ::= TS <type>
1996 ::= GV <(object) name>
1997 ::= T <call-offset> <(base) encoding>
1998 ::= Tc <call-offset> <call-offset> <(base) encoding>
1999 Also g++ extensions:
2000 ::= TC <type> <(offset) number> _ <(base) type>
2001 ::= TF <type>
2002 ::= TJ <type>
2003 ::= GR <name>
2004 ::= GA <encoding>
2005 ::= Gr <resource name>
2006 ::= GTt <encoding>
2007 ::= GTn <encoding>
2010 static struct demangle_component *
2011 d_special_name (struct d_info *di)
2013 di->expansion += 20;
2014 if (d_check_char (di, 'T'))
2016 switch (d_next_char (di))
2018 case 'V':
2019 di->expansion -= 5;
2020 return d_make_comp (di, DEMANGLE_COMPONENT_VTABLE,
2021 cplus_demangle_type (di), NULL);
2022 case 'T':
2023 di->expansion -= 10;
2024 return d_make_comp (di, DEMANGLE_COMPONENT_VTT,
2025 cplus_demangle_type (di), NULL);
2026 case 'I':
2027 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO,
2028 cplus_demangle_type (di), NULL);
2029 case 'S':
2030 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_NAME,
2031 cplus_demangle_type (di), NULL);
2033 case 'h':
2034 if (! d_call_offset (di, 'h'))
2035 return NULL;
2036 return d_make_comp (di, DEMANGLE_COMPONENT_THUNK,
2037 d_encoding (di, 0), NULL);
2039 case 'v':
2040 if (! d_call_offset (di, 'v'))
2041 return NULL;
2042 return d_make_comp (di, DEMANGLE_COMPONENT_VIRTUAL_THUNK,
2043 d_encoding (di, 0), NULL);
2045 case 'c':
2046 if (! d_call_offset (di, '\0'))
2047 return NULL;
2048 if (! d_call_offset (di, '\0'))
2049 return NULL;
2050 return d_make_comp (di, DEMANGLE_COMPONENT_COVARIANT_THUNK,
2051 d_encoding (di, 0), NULL);
2053 case 'C':
2055 struct demangle_component *derived_type;
2056 int offset;
2057 struct demangle_component *base_type;
2059 derived_type = cplus_demangle_type (di);
2060 offset = d_number (di);
2061 if (offset < 0)
2062 return NULL;
2063 if (! d_check_char (di, '_'))
2064 return NULL;
2065 base_type = cplus_demangle_type (di);
2066 /* We don't display the offset. FIXME: We should display
2067 it in verbose mode. */
2068 di->expansion += 5;
2069 return d_make_comp (di, DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE,
2070 base_type, derived_type);
2073 case 'F':
2074 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_FN,
2075 cplus_demangle_type (di), NULL);
2076 case 'J':
2077 return d_make_comp (di, DEMANGLE_COMPONENT_JAVA_CLASS,
2078 cplus_demangle_type (di), NULL);
2080 case 'H':
2081 return d_make_comp (di, DEMANGLE_COMPONENT_TLS_INIT,
2082 d_name (di, 0), NULL);
2084 case 'W':
2085 return d_make_comp (di, DEMANGLE_COMPONENT_TLS_WRAPPER,
2086 d_name (di, 0), NULL);
2088 default:
2089 return NULL;
2092 else if (d_check_char (di, 'G'))
2094 switch (d_next_char (di))
2096 case 'V':
2097 return d_make_comp (di, DEMANGLE_COMPONENT_GUARD,
2098 d_name (di, 0), NULL);
2100 case 'R':
2102 struct demangle_component *name = d_name (di, 0);
2103 return d_make_comp (di, DEMANGLE_COMPONENT_REFTEMP, name,
2104 d_number_component (di));
2107 case 'A':
2108 return d_make_comp (di, DEMANGLE_COMPONENT_HIDDEN_ALIAS,
2109 d_encoding (di, 0), NULL);
2111 case 'T':
2112 switch (d_next_char (di))
2114 case 'n':
2115 return d_make_comp (di, DEMANGLE_COMPONENT_NONTRANSACTION_CLONE,
2116 d_encoding (di, 0), NULL);
2117 default:
2118 /* ??? The proposal is that other letters (such as 'h') stand
2119 for different variants of transaction cloning, such as
2120 compiling directly for hardware transaction support. But
2121 they still should all be transactional clones of some sort
2122 so go ahead and call them that. */
2123 case 't':
2124 return d_make_comp (di, DEMANGLE_COMPONENT_TRANSACTION_CLONE,
2125 d_encoding (di, 0), NULL);
2128 case 'r':
2129 return d_java_resource (di);
2131 default:
2132 return NULL;
2135 else
2136 return NULL;
2139 /* <call-offset> ::= h <nv-offset> _
2140 ::= v <v-offset> _
2142 <nv-offset> ::= <(offset) number>
2144 <v-offset> ::= <(offset) number> _ <(virtual offset) number>
2146 The C parameter, if not '\0', is a character we just read which is
2147 the start of the <call-offset>.
2149 We don't display the offset information anywhere. FIXME: We should
2150 display it in verbose mode. */
2152 static int
2153 d_call_offset (struct d_info *di, int c)
2155 if (c == '\0')
2156 c = d_next_char (di);
2158 if (c == 'h')
2159 d_number (di);
2160 else if (c == 'v')
2162 d_number (di);
2163 if (! d_check_char (di, '_'))
2164 return 0;
2165 d_number (di);
2167 else
2168 return 0;
2170 if (! d_check_char (di, '_'))
2171 return 0;
2173 return 1;
2176 /* <ctor-dtor-name> ::= C1
2177 ::= C2
2178 ::= C3
2179 ::= D0
2180 ::= D1
2181 ::= D2
2184 static struct demangle_component *
2185 d_ctor_dtor_name (struct d_info *di)
2187 if (di->last_name != NULL)
2189 if (di->last_name->type == DEMANGLE_COMPONENT_NAME)
2190 di->expansion += di->last_name->u.s_name.len;
2191 else if (di->last_name->type == DEMANGLE_COMPONENT_SUB_STD)
2192 di->expansion += di->last_name->u.s_string.len;
2194 switch (d_peek_char (di))
2196 case 'C':
2198 enum gnu_v3_ctor_kinds kind;
2199 int inheriting = 0;
2201 if (d_peek_next_char (di) == 'I')
2203 inheriting = 1;
2204 d_advance (di, 1);
2207 switch (d_peek_next_char (di))
2209 case '1':
2210 kind = gnu_v3_complete_object_ctor;
2211 break;
2212 case '2':
2213 kind = gnu_v3_base_object_ctor;
2214 break;
2215 case '3':
2216 kind = gnu_v3_complete_object_allocating_ctor;
2217 break;
2218 case '4':
2219 kind = gnu_v3_unified_ctor;
2220 break;
2221 case '5':
2222 kind = gnu_v3_object_ctor_group;
2223 break;
2224 default:
2225 return NULL;
2228 d_advance (di, 2);
2230 if (inheriting)
2231 cplus_demangle_type (di);
2233 return d_make_ctor (di, kind, di->last_name);
2236 case 'D':
2238 enum gnu_v3_dtor_kinds kind;
2240 switch (d_peek_next_char (di))
2242 case '0':
2243 kind = gnu_v3_deleting_dtor;
2244 break;
2245 case '1':
2246 kind = gnu_v3_complete_object_dtor;
2247 break;
2248 case '2':
2249 kind = gnu_v3_base_object_dtor;
2250 break;
2251 /* digit '3' is not used */
2252 case '4':
2253 kind = gnu_v3_unified_dtor;
2254 break;
2255 case '5':
2256 kind = gnu_v3_object_dtor_group;
2257 break;
2258 default:
2259 return NULL;
2261 d_advance (di, 2);
2262 return d_make_dtor (di, kind, di->last_name);
2265 default:
2266 return NULL;
2270 /* True iff we're looking at an order-insensitive type-qualifier, including
2271 function-type-qualifiers. */
2273 static int
2274 next_is_type_qual (struct d_info *di)
2276 char peek = d_peek_char (di);
2277 if (peek == 'r' || peek == 'V' || peek == 'K')
2278 return 1;
2279 if (peek == 'D')
2281 peek = d_peek_next_char (di);
2282 if (peek == 'x' || peek == 'o' || peek == 'O' || peek == 'w')
2283 return 1;
2285 return 0;
2288 /* <type> ::= <builtin-type>
2289 ::= <function-type>
2290 ::= <class-enum-type>
2291 ::= <array-type>
2292 ::= <pointer-to-member-type>
2293 ::= <template-param>
2294 ::= <template-template-param> <template-args>
2295 ::= <substitution>
2296 ::= <CV-qualifiers> <type>
2297 ::= P <type>
2298 ::= R <type>
2299 ::= O <type> (C++0x)
2300 ::= C <type>
2301 ::= G <type>
2302 ::= U <source-name> <type>
2304 <builtin-type> ::= various one letter codes
2305 ::= u <source-name>
2308 CP_STATIC_IF_GLIBCPP_V3
2309 const struct demangle_builtin_type_info
2310 cplus_demangle_builtin_types[D_BUILTIN_TYPE_COUNT] =
2312 /* a */ { NL ("signed char"), NL ("signed char"), D_PRINT_DEFAULT },
2313 /* b */ { NL ("bool"), NL ("boolean"), D_PRINT_BOOL },
2314 /* c */ { NL ("char"), NL ("byte"), D_PRINT_DEFAULT },
2315 /* d */ { NL ("double"), NL ("double"), D_PRINT_FLOAT },
2316 /* e */ { NL ("long double"), NL ("long double"), D_PRINT_FLOAT },
2317 /* f */ { NL ("float"), NL ("float"), D_PRINT_FLOAT },
2318 /* g */ { NL ("__float128"), NL ("__float128"), D_PRINT_FLOAT },
2319 /* h */ { NL ("unsigned char"), NL ("unsigned char"), D_PRINT_DEFAULT },
2320 /* i */ { NL ("int"), NL ("int"), D_PRINT_INT },
2321 /* j */ { NL ("unsigned int"), NL ("unsigned"), D_PRINT_UNSIGNED },
2322 /* k */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2323 /* l */ { NL ("long"), NL ("long"), D_PRINT_LONG },
2324 /* m */ { NL ("unsigned long"), NL ("unsigned long"), D_PRINT_UNSIGNED_LONG },
2325 /* n */ { NL ("__int128"), NL ("__int128"), D_PRINT_DEFAULT },
2326 /* o */ { NL ("unsigned __int128"), NL ("unsigned __int128"),
2327 D_PRINT_DEFAULT },
2328 /* p */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2329 /* q */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2330 /* r */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2331 /* s */ { NL ("short"), NL ("short"), D_PRINT_DEFAULT },
2332 /* t */ { NL ("unsigned short"), NL ("unsigned short"), D_PRINT_DEFAULT },
2333 /* u */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2334 /* v */ { NL ("void"), NL ("void"), D_PRINT_VOID },
2335 /* w */ { NL ("wchar_t"), NL ("char"), D_PRINT_DEFAULT },
2336 /* x */ { NL ("long long"), NL ("long"), D_PRINT_LONG_LONG },
2337 /* y */ { NL ("unsigned long long"), NL ("unsigned long long"),
2338 D_PRINT_UNSIGNED_LONG_LONG },
2339 /* z */ { NL ("..."), NL ("..."), D_PRINT_DEFAULT },
2340 /* 26 */ { NL ("decimal32"), NL ("decimal32"), D_PRINT_DEFAULT },
2341 /* 27 */ { NL ("decimal64"), NL ("decimal64"), D_PRINT_DEFAULT },
2342 /* 28 */ { NL ("decimal128"), NL ("decimal128"), D_PRINT_DEFAULT },
2343 /* 29 */ { NL ("half"), NL ("half"), D_PRINT_FLOAT },
2344 /* 30 */ { NL ("char16_t"), NL ("char16_t"), D_PRINT_DEFAULT },
2345 /* 31 */ { NL ("char32_t"), NL ("char32_t"), D_PRINT_DEFAULT },
2346 /* 32 */ { NL ("decltype(nullptr)"), NL ("decltype(nullptr)"),
2347 D_PRINT_DEFAULT },
2350 CP_STATIC_IF_GLIBCPP_V3
2351 struct demangle_component *
2352 cplus_demangle_type (struct d_info *di)
2354 char peek;
2355 struct demangle_component *ret;
2356 int can_subst;
2358 /* The ABI specifies that when CV-qualifiers are used, the base type
2359 is substitutable, and the fully qualified type is substitutable,
2360 but the base type with a strict subset of the CV-qualifiers is
2361 not substitutable. The natural recursive implementation of the
2362 CV-qualifiers would cause subsets to be substitutable, so instead
2363 we pull them all off now.
2365 FIXME: The ABI says that order-insensitive vendor qualifiers
2366 should be handled in the same way, but we have no way to tell
2367 which vendor qualifiers are order-insensitive and which are
2368 order-sensitive. So we just assume that they are all
2369 order-sensitive. g++ 3.4 supports only one vendor qualifier,
2370 __vector, and it treats it as order-sensitive when mangling
2371 names. */
2373 if (next_is_type_qual (di))
2375 struct demangle_component **pret;
2377 pret = d_cv_qualifiers (di, &ret, 0);
2378 if (pret == NULL)
2379 return NULL;
2380 if (d_peek_char (di) == 'F')
2382 /* cv-qualifiers before a function type apply to 'this',
2383 so avoid adding the unqualified function type to
2384 the substitution list. */
2385 *pret = d_function_type (di);
2387 else
2388 *pret = cplus_demangle_type (di);
2389 if (!*pret)
2390 return NULL;
2391 if ((*pret)->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
2392 || (*pret)->type == DEMANGLE_COMPONENT_REFERENCE_THIS)
2394 /* Move the ref-qualifier outside the cv-qualifiers so that
2395 they are printed in the right order. */
2396 struct demangle_component *fn = d_left (*pret);
2397 d_left (*pret) = ret;
2398 ret = *pret;
2399 *pret = fn;
2401 if (! d_add_substitution (di, ret))
2402 return NULL;
2403 return ret;
2406 can_subst = 1;
2408 peek = d_peek_char (di);
2409 switch (peek)
2411 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
2412 case 'h': case 'i': case 'j': case 'l': case 'm': case 'n':
2413 case 'o': case 's': case 't':
2414 case 'v': case 'w': case 'x': case 'y': case 'z':
2415 ret = d_make_builtin_type (di,
2416 &cplus_demangle_builtin_types[peek - 'a']);
2417 di->expansion += ret->u.s_builtin.type->len;
2418 can_subst = 0;
2419 d_advance (di, 1);
2420 break;
2422 case 'u':
2423 d_advance (di, 1);
2424 ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE,
2425 d_source_name (di), NULL);
2426 break;
2428 case 'F':
2429 ret = d_function_type (di);
2430 break;
2432 case '0': case '1': case '2': case '3': case '4':
2433 case '5': case '6': case '7': case '8': case '9':
2434 case 'N':
2435 case 'Z':
2436 ret = d_class_enum_type (di);
2437 break;
2439 case 'A':
2440 ret = d_array_type (di);
2441 break;
2443 case 'M':
2444 ret = d_pointer_to_member_type (di);
2445 break;
2447 case 'T':
2448 ret = d_template_param (di);
2449 if (d_peek_char (di) == 'I')
2451 /* This may be <template-template-param> <template-args>.
2452 If this is the type for a conversion operator, we can
2453 have a <template-template-param> here only by following
2454 a derivation like this:
2456 <nested-name>
2457 -> <template-prefix> <template-args>
2458 -> <prefix> <template-unqualified-name> <template-args>
2459 -> <unqualified-name> <template-unqualified-name> <template-args>
2460 -> <source-name> <template-unqualified-name> <template-args>
2461 -> <source-name> <operator-name> <template-args>
2462 -> <source-name> cv <type> <template-args>
2463 -> <source-name> cv <template-template-param> <template-args> <template-args>
2465 where the <template-args> is followed by another.
2466 Otherwise, we must have a derivation like this:
2468 <nested-name>
2469 -> <template-prefix> <template-args>
2470 -> <prefix> <template-unqualified-name> <template-args>
2471 -> <unqualified-name> <template-unqualified-name> <template-args>
2472 -> <source-name> <template-unqualified-name> <template-args>
2473 -> <source-name> <operator-name> <template-args>
2474 -> <source-name> cv <type> <template-args>
2475 -> <source-name> cv <template-param> <template-args>
2477 where we need to leave the <template-args> to be processed
2478 by d_prefix (following the <template-prefix>).
2480 The <template-template-param> part is a substitution
2481 candidate. */
2482 if (! di->is_conversion)
2484 if (! d_add_substitution (di, ret))
2485 return NULL;
2486 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2487 d_template_args (di));
2489 else
2491 struct demangle_component *args;
2492 struct d_info_checkpoint checkpoint;
2494 d_checkpoint (di, &checkpoint);
2495 args = d_template_args (di);
2496 if (d_peek_char (di) == 'I')
2498 if (! d_add_substitution (di, ret))
2499 return NULL;
2500 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2501 args);
2503 else
2504 d_backtrack (di, &checkpoint);
2507 break;
2509 case 'S':
2510 /* If this is a special substitution, then it is the start of
2511 <class-enum-type>. */
2513 char peek_next;
2515 peek_next = d_peek_next_char (di);
2516 if (IS_DIGIT (peek_next)
2517 || peek_next == '_'
2518 || IS_UPPER (peek_next))
2520 ret = d_substitution (di, 0);
2521 /* The substituted name may have been a template name and
2522 may be followed by tepmlate args. */
2523 if (d_peek_char (di) == 'I')
2524 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2525 d_template_args (di));
2526 else
2527 can_subst = 0;
2529 else
2531 ret = d_class_enum_type (di);
2532 /* If the substitution was a complete type, then it is not
2533 a new substitution candidate. However, if the
2534 substitution was followed by template arguments, then
2535 the whole thing is a substitution candidate. */
2536 if (ret != NULL && ret->type == DEMANGLE_COMPONENT_SUB_STD)
2537 can_subst = 0;
2540 break;
2542 case 'O':
2543 d_advance (di, 1);
2544 ret = d_make_comp (di, DEMANGLE_COMPONENT_RVALUE_REFERENCE,
2545 cplus_demangle_type (di), NULL);
2546 break;
2548 case 'P':
2549 d_advance (di, 1);
2550 ret = d_make_comp (di, DEMANGLE_COMPONENT_POINTER,
2551 cplus_demangle_type (di), NULL);
2552 break;
2554 case 'R':
2555 d_advance (di, 1);
2556 ret = d_make_comp (di, DEMANGLE_COMPONENT_REFERENCE,
2557 cplus_demangle_type (di), NULL);
2558 break;
2560 case 'C':
2561 d_advance (di, 1);
2562 ret = d_make_comp (di, DEMANGLE_COMPONENT_COMPLEX,
2563 cplus_demangle_type (di), NULL);
2564 break;
2566 case 'G':
2567 d_advance (di, 1);
2568 ret = d_make_comp (di, DEMANGLE_COMPONENT_IMAGINARY,
2569 cplus_demangle_type (di), NULL);
2570 break;
2572 case 'U':
2573 d_advance (di, 1);
2574 ret = d_source_name (di);
2575 if (d_peek_char (di) == 'I')
2576 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2577 d_template_args (di));
2578 ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL,
2579 cplus_demangle_type (di), ret);
2580 break;
2582 case 'D':
2583 can_subst = 0;
2584 d_advance (di, 1);
2585 peek = d_next_char (di);
2586 switch (peek)
2588 case 'T':
2589 case 't':
2590 /* decltype (expression) */
2591 ret = d_make_comp (di, DEMANGLE_COMPONENT_DECLTYPE,
2592 d_expression (di), NULL);
2593 if (ret && d_next_char (di) != 'E')
2594 ret = NULL;
2595 can_subst = 1;
2596 break;
2598 case 'p':
2599 /* Pack expansion. */
2600 ret = d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION,
2601 cplus_demangle_type (di), NULL);
2602 can_subst = 1;
2603 break;
2605 case 'a':
2606 /* auto */
2607 ret = d_make_name (di, "auto", 4);
2608 break;
2609 case 'c':
2610 /* decltype(auto) */
2611 ret = d_make_name (di, "decltype(auto)", 14);
2612 break;
2614 case 'f':
2615 /* 32-bit decimal floating point */
2616 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[26]);
2617 di->expansion += ret->u.s_builtin.type->len;
2618 break;
2619 case 'd':
2620 /* 64-bit DFP */
2621 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[27]);
2622 di->expansion += ret->u.s_builtin.type->len;
2623 break;
2624 case 'e':
2625 /* 128-bit DFP */
2626 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[28]);
2627 di->expansion += ret->u.s_builtin.type->len;
2628 break;
2629 case 'h':
2630 /* 16-bit half-precision FP */
2631 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[29]);
2632 di->expansion += ret->u.s_builtin.type->len;
2633 break;
2634 case 's':
2635 /* char16_t */
2636 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[30]);
2637 di->expansion += ret->u.s_builtin.type->len;
2638 break;
2639 case 'i':
2640 /* char32_t */
2641 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[31]);
2642 di->expansion += ret->u.s_builtin.type->len;
2643 break;
2645 case 'F':
2646 /* Fixed point types. DF<int bits><length><fract bits><sat> */
2647 ret = d_make_empty (di);
2648 ret->type = DEMANGLE_COMPONENT_FIXED_TYPE;
2649 if ((ret->u.s_fixed.accum = IS_DIGIT (d_peek_char (di))))
2650 /* For demangling we don't care about the bits. */
2651 d_number (di);
2652 ret->u.s_fixed.length = cplus_demangle_type (di);
2653 if (ret->u.s_fixed.length == NULL)
2654 return NULL;
2655 d_number (di);
2656 peek = d_next_char (di);
2657 ret->u.s_fixed.sat = (peek == 's');
2658 break;
2660 case 'v':
2661 ret = d_vector_type (di);
2662 can_subst = 1;
2663 break;
2665 case 'n':
2666 /* decltype(nullptr) */
2667 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[32]);
2668 di->expansion += ret->u.s_builtin.type->len;
2669 break;
2671 default:
2672 return NULL;
2674 break;
2676 default:
2677 return NULL;
2680 if (can_subst)
2682 if (! d_add_substitution (di, ret))
2683 return NULL;
2686 return ret;
2689 /* <CV-qualifiers> ::= [r] [V] [K] [Dx] */
2691 static struct demangle_component **
2692 d_cv_qualifiers (struct d_info *di,
2693 struct demangle_component **pret, int member_fn)
2695 struct demangle_component **pstart;
2696 char peek;
2698 pstart = pret;
2699 peek = d_peek_char (di);
2700 while (next_is_type_qual (di))
2702 enum demangle_component_type t;
2703 struct demangle_component *right = NULL;
2705 d_advance (di, 1);
2706 if (peek == 'r')
2708 t = (member_fn
2709 ? DEMANGLE_COMPONENT_RESTRICT_THIS
2710 : DEMANGLE_COMPONENT_RESTRICT);
2711 di->expansion += sizeof "restrict";
2713 else if (peek == 'V')
2715 t = (member_fn
2716 ? DEMANGLE_COMPONENT_VOLATILE_THIS
2717 : DEMANGLE_COMPONENT_VOLATILE);
2718 di->expansion += sizeof "volatile";
2720 else if (peek == 'K')
2722 t = (member_fn
2723 ? DEMANGLE_COMPONENT_CONST_THIS
2724 : DEMANGLE_COMPONENT_CONST);
2725 di->expansion += sizeof "const";
2727 else
2729 peek = d_next_char (di);
2730 if (peek == 'x')
2732 t = DEMANGLE_COMPONENT_TRANSACTION_SAFE;
2733 di->expansion += sizeof "transaction_safe";
2735 else if (peek == 'o'
2736 || peek == 'O')
2738 t = DEMANGLE_COMPONENT_NOEXCEPT;
2739 di->expansion += sizeof "noexcept";
2740 if (peek == 'O')
2742 right = d_expression (di);
2743 if (right == NULL)
2744 return NULL;
2745 if (! d_check_char (di, 'E'))
2746 return NULL;
2749 else if (peek == 'w')
2751 t = DEMANGLE_COMPONENT_THROW_SPEC;
2752 di->expansion += sizeof "throw";
2753 right = d_parmlist (di);
2754 if (right == NULL)
2755 return NULL;
2756 if (! d_check_char (di, 'E'))
2757 return NULL;
2759 else
2760 return NULL;
2763 *pret = d_make_comp (di, t, NULL, right);
2764 if (*pret == NULL)
2765 return NULL;
2766 pret = &d_left (*pret);
2768 peek = d_peek_char (di);
2771 if (!member_fn && peek == 'F')
2773 while (pstart != pret)
2775 switch ((*pstart)->type)
2777 case DEMANGLE_COMPONENT_RESTRICT:
2778 (*pstart)->type = DEMANGLE_COMPONENT_RESTRICT_THIS;
2779 break;
2780 case DEMANGLE_COMPONENT_VOLATILE:
2781 (*pstart)->type = DEMANGLE_COMPONENT_VOLATILE_THIS;
2782 break;
2783 case DEMANGLE_COMPONENT_CONST:
2784 (*pstart)->type = DEMANGLE_COMPONENT_CONST_THIS;
2785 break;
2786 default:
2787 break;
2789 pstart = &d_left (*pstart);
2793 return pret;
2796 /* <ref-qualifier> ::= R
2797 ::= O */
2799 static struct demangle_component *
2800 d_ref_qualifier (struct d_info *di, struct demangle_component *sub)
2802 struct demangle_component *ret = sub;
2803 char peek;
2805 peek = d_peek_char (di);
2806 if (peek == 'R' || peek == 'O')
2808 enum demangle_component_type t;
2809 if (peek == 'R')
2811 t = DEMANGLE_COMPONENT_REFERENCE_THIS;
2812 di->expansion += sizeof "&";
2814 else
2816 t = DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS;
2817 di->expansion += sizeof "&&";
2819 d_advance (di, 1);
2821 ret = d_make_comp (di, t, ret, NULL);
2824 return ret;
2827 /* <function-type> ::= F [Y] <bare-function-type> [<ref-qualifier>] [T] E */
2829 static struct demangle_component *
2830 d_function_type (struct d_info *di)
2832 struct demangle_component *ret;
2834 if (! d_check_char (di, 'F'))
2835 return NULL;
2836 if (d_peek_char (di) == 'Y')
2838 /* Function has C linkage. We don't print this information.
2839 FIXME: We should print it in verbose mode. */
2840 d_advance (di, 1);
2842 ret = d_bare_function_type (di, 1);
2843 ret = d_ref_qualifier (di, ret);
2845 if (! d_check_char (di, 'E'))
2846 return NULL;
2847 return ret;
2850 /* <type>+ */
2852 static struct demangle_component *
2853 d_parmlist (struct d_info *di)
2855 struct demangle_component *tl;
2856 struct demangle_component **ptl;
2858 tl = NULL;
2859 ptl = &tl;
2860 while (1)
2862 struct demangle_component *type;
2864 char peek = d_peek_char (di);
2865 if (peek == '\0' || peek == 'E' || peek == '.')
2866 break;
2867 if ((peek == 'R' || peek == 'O')
2868 && d_peek_next_char (di) == 'E')
2869 /* Function ref-qualifier, not a ref prefix for a parameter type. */
2870 break;
2871 type = cplus_demangle_type (di);
2872 if (type == NULL)
2873 return NULL;
2874 *ptl = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, type, NULL);
2875 if (*ptl == NULL)
2876 return NULL;
2877 ptl = &d_right (*ptl);
2880 /* There should be at least one parameter type besides the optional
2881 return type. A function which takes no arguments will have a
2882 single parameter type void. */
2883 if (tl == NULL)
2884 return NULL;
2886 /* If we have a single parameter type void, omit it. */
2887 if (d_right (tl) == NULL
2888 && d_left (tl)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
2889 && d_left (tl)->u.s_builtin.type->print == D_PRINT_VOID)
2891 di->expansion -= d_left (tl)->u.s_builtin.type->len;
2892 d_left (tl) = NULL;
2895 return tl;
2898 /* <bare-function-type> ::= [J]<type>+ */
2900 static struct demangle_component *
2901 d_bare_function_type (struct d_info *di, int has_return_type)
2903 struct demangle_component *return_type;
2904 struct demangle_component *tl;
2905 char peek;
2907 /* Detect special qualifier indicating that the first argument
2908 is the return type. */
2909 peek = d_peek_char (di);
2910 if (peek == 'J')
2912 d_advance (di, 1);
2913 has_return_type = 1;
2916 if (has_return_type)
2918 return_type = cplus_demangle_type (di);
2919 if (return_type == NULL)
2920 return NULL;
2922 else
2923 return_type = NULL;
2925 tl = d_parmlist (di);
2926 if (tl == NULL)
2927 return NULL;
2929 return d_make_comp (di, DEMANGLE_COMPONENT_FUNCTION_TYPE,
2930 return_type, tl);
2933 /* <class-enum-type> ::= <name> */
2935 static struct demangle_component *
2936 d_class_enum_type (struct d_info *di)
2938 return d_name (di, 0);
2941 /* <array-type> ::= A <(positive dimension) number> _ <(element) type>
2942 ::= A [<(dimension) expression>] _ <(element) type>
2945 static struct demangle_component *
2946 d_array_type (struct d_info *di)
2948 char peek;
2949 struct demangle_component *dim;
2951 if (! d_check_char (di, 'A'))
2952 return NULL;
2954 peek = d_peek_char (di);
2955 if (peek == '_')
2956 dim = NULL;
2957 else if (IS_DIGIT (peek))
2959 const char *s;
2961 s = d_str (di);
2964 d_advance (di, 1);
2965 peek = d_peek_char (di);
2967 while (IS_DIGIT (peek));
2968 dim = d_make_name (di, s, d_str (di) - s);
2969 if (dim == NULL)
2970 return NULL;
2972 else
2974 dim = d_expression (di);
2975 if (dim == NULL)
2976 return NULL;
2979 if (! d_check_char (di, '_'))
2980 return NULL;
2982 return d_make_comp (di, DEMANGLE_COMPONENT_ARRAY_TYPE, dim,
2983 cplus_demangle_type (di));
2986 /* <vector-type> ::= Dv <number> _ <type>
2987 ::= Dv _ <expression> _ <type> */
2989 static struct demangle_component *
2990 d_vector_type (struct d_info *di)
2992 char peek;
2993 struct demangle_component *dim;
2995 peek = d_peek_char (di);
2996 if (peek == '_')
2998 d_advance (di, 1);
2999 dim = d_expression (di);
3001 else
3002 dim = d_number_component (di);
3004 if (dim == NULL)
3005 return NULL;
3007 if (! d_check_char (di, '_'))
3008 return NULL;
3010 return d_make_comp (di, DEMANGLE_COMPONENT_VECTOR_TYPE, dim,
3011 cplus_demangle_type (di));
3014 /* <pointer-to-member-type> ::= M <(class) type> <(member) type> */
3016 static struct demangle_component *
3017 d_pointer_to_member_type (struct d_info *di)
3019 struct demangle_component *cl;
3020 struct demangle_component *mem;
3022 if (! d_check_char (di, 'M'))
3023 return NULL;
3025 cl = cplus_demangle_type (di);
3026 if (cl == NULL)
3027 return NULL;
3029 /* The ABI says, "The type of a non-static member function is considered
3030 to be different, for the purposes of substitution, from the type of a
3031 namespace-scope or static member function whose type appears
3032 similar. The types of two non-static member functions are considered
3033 to be different, for the purposes of substitution, if the functions
3034 are members of different classes. In other words, for the purposes of
3035 substitution, the class of which the function is a member is
3036 considered part of the type of function."
3038 For a pointer to member function, this call to cplus_demangle_type
3039 will end up adding a (possibly qualified) non-member function type to
3040 the substitution table, which is not correct; however, the member
3041 function type will never be used in a substitution, so putting the
3042 wrong type in the substitution table is harmless. */
3044 mem = cplus_demangle_type (di);
3045 if (mem == NULL)
3046 return NULL;
3048 return d_make_comp (di, DEMANGLE_COMPONENT_PTRMEM_TYPE, cl, mem);
3051 /* <non-negative number> _ */
3053 static int
3054 d_compact_number (struct d_info *di)
3056 int num;
3057 if (d_peek_char (di) == '_')
3058 num = 0;
3059 else if (d_peek_char (di) == 'n')
3060 return -1;
3061 else
3062 num = d_number (di) + 1;
3064 if (num < 0 || ! d_check_char (di, '_'))
3065 return -1;
3066 return num;
3069 /* <template-param> ::= T_
3070 ::= T <(parameter-2 non-negative) number> _
3073 static struct demangle_component *
3074 d_template_param (struct d_info *di)
3076 int param;
3078 if (! d_check_char (di, 'T'))
3079 return NULL;
3081 param = d_compact_number (di);
3082 if (param < 0)
3083 return NULL;
3085 return d_make_template_param (di, param);
3088 /* <template-args> ::= I <template-arg>+ E */
3090 static struct demangle_component *
3091 d_template_args (struct d_info *di)
3093 if (d_peek_char (di) != 'I'
3094 && d_peek_char (di) != 'J')
3095 return NULL;
3096 d_advance (di, 1);
3098 return d_template_args_1 (di);
3101 /* <template-arg>* E */
3103 static struct demangle_component *
3104 d_template_args_1 (struct d_info *di)
3106 struct demangle_component *hold_last_name;
3107 struct demangle_component *al;
3108 struct demangle_component **pal;
3110 /* Preserve the last name we saw--don't let the template arguments
3111 clobber it, as that would give us the wrong name for a subsequent
3112 constructor or destructor. */
3113 hold_last_name = di->last_name;
3115 if (d_peek_char (di) == 'E')
3117 /* An argument pack can be empty. */
3118 d_advance (di, 1);
3119 return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, NULL, NULL);
3122 al = NULL;
3123 pal = &al;
3124 while (1)
3126 struct demangle_component *a;
3128 a = d_template_arg (di);
3129 if (a == NULL)
3130 return NULL;
3132 *pal = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, a, NULL);
3133 if (*pal == NULL)
3134 return NULL;
3135 pal = &d_right (*pal);
3137 if (d_peek_char (di) == 'E')
3139 d_advance (di, 1);
3140 break;
3144 di->last_name = hold_last_name;
3146 return al;
3149 /* <template-arg> ::= <type>
3150 ::= X <expression> E
3151 ::= <expr-primary>
3154 static struct demangle_component *
3155 d_template_arg (struct d_info *di)
3157 struct demangle_component *ret;
3159 switch (d_peek_char (di))
3161 case 'X':
3162 d_advance (di, 1);
3163 ret = d_expression (di);
3164 if (! d_check_char (di, 'E'))
3165 return NULL;
3166 return ret;
3168 case 'L':
3169 return d_expr_primary (di);
3171 case 'I':
3172 case 'J':
3173 /* An argument pack. */
3174 return d_template_args (di);
3176 default:
3177 return cplus_demangle_type (di);
3181 /* Parse a sequence of expressions until we hit the terminator
3182 character. */
3184 static struct demangle_component *
3185 d_exprlist (struct d_info *di, char terminator)
3187 struct demangle_component *list = NULL;
3188 struct demangle_component **p = &list;
3190 if (d_peek_char (di) == terminator)
3192 d_advance (di, 1);
3193 return d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, NULL, NULL);
3196 while (1)
3198 struct demangle_component *arg = d_expression (di);
3199 if (arg == NULL)
3200 return NULL;
3202 *p = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, arg, NULL);
3203 if (*p == NULL)
3204 return NULL;
3205 p = &d_right (*p);
3207 if (d_peek_char (di) == terminator)
3209 d_advance (di, 1);
3210 break;
3214 return list;
3217 /* Returns nonzero iff OP is an operator for a C++ cast: const_cast,
3218 dynamic_cast, static_cast or reinterpret_cast. */
3220 static int
3221 op_is_new_cast (struct demangle_component *op)
3223 const char *code = op->u.s_operator.op->code;
3224 return (code[1] == 'c'
3225 && (code[0] == 's' || code[0] == 'd'
3226 || code[0] == 'c' || code[0] == 'r'));
3229 /* <expression> ::= <(unary) operator-name> <expression>
3230 ::= <(binary) operator-name> <expression> <expression>
3231 ::= <(trinary) operator-name> <expression> <expression> <expression>
3232 ::= cl <expression>+ E
3233 ::= st <type>
3234 ::= <template-param>
3235 ::= sr <type> <unqualified-name>
3236 ::= sr <type> <unqualified-name> <template-args>
3237 ::= <expr-primary>
3240 static inline struct demangle_component *
3241 d_expression_1 (struct d_info *di)
3243 char peek;
3245 peek = d_peek_char (di);
3246 if (peek == 'L')
3247 return d_expr_primary (di);
3248 else if (peek == 'T')
3249 return d_template_param (di);
3250 else if (peek == 's' && d_peek_next_char (di) == 'r')
3252 struct demangle_component *type;
3253 struct demangle_component *name;
3255 d_advance (di, 2);
3256 type = cplus_demangle_type (di);
3257 name = d_unqualified_name (di);
3258 if (d_peek_char (di) != 'I')
3259 return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type, name);
3260 else
3261 return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type,
3262 d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
3263 d_template_args (di)));
3265 else if (peek == 's' && d_peek_next_char (di) == 'p')
3267 d_advance (di, 2);
3268 return d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION,
3269 d_expression_1 (di), NULL);
3271 else if (peek == 'f' && d_peek_next_char (di) == 'p')
3273 /* Function parameter used in a late-specified return type. */
3274 int index;
3275 d_advance (di, 2);
3276 if (d_peek_char (di) == 'T')
3278 /* 'this' parameter. */
3279 d_advance (di, 1);
3280 index = 0;
3282 else
3284 index = d_compact_number (di);
3285 if (index == INT_MAX || index == -1)
3286 return NULL;
3287 index++;
3289 return d_make_function_param (di, index);
3291 else if (IS_DIGIT (peek)
3292 || (peek == 'o' && d_peek_next_char (di) == 'n'))
3294 /* We can get an unqualified name as an expression in the case of
3295 a dependent function call, i.e. decltype(f(t)). */
3296 struct demangle_component *name;
3298 if (peek == 'o')
3299 /* operator-function-id, i.e. operator+(t). */
3300 d_advance (di, 2);
3302 name = d_unqualified_name (di);
3303 if (name == NULL)
3304 return NULL;
3305 if (d_peek_char (di) == 'I')
3306 return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
3307 d_template_args (di));
3308 else
3309 return name;
3311 else if ((peek == 'i' || peek == 't')
3312 && d_peek_next_char (di) == 'l')
3314 /* Brace-enclosed initializer list, untyped or typed. */
3315 struct demangle_component *type = NULL;
3316 if (peek == 't')
3317 type = cplus_demangle_type (di);
3318 if (!d_peek_next_char (di))
3319 return NULL;
3320 d_advance (di, 2);
3321 return d_make_comp (di, DEMANGLE_COMPONENT_INITIALIZER_LIST,
3322 type, d_exprlist (di, 'E'));
3324 else
3326 struct demangle_component *op;
3327 const char *code = NULL;
3328 int args;
3330 op = d_operator_name (di);
3331 if (op == NULL)
3332 return NULL;
3334 if (op->type == DEMANGLE_COMPONENT_OPERATOR)
3336 code = op->u.s_operator.op->code;
3337 di->expansion += op->u.s_operator.op->len - 2;
3338 if (strcmp (code, "st") == 0)
3339 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
3340 cplus_demangle_type (di));
3343 switch (op->type)
3345 default:
3346 return NULL;
3347 case DEMANGLE_COMPONENT_OPERATOR:
3348 args = op->u.s_operator.op->args;
3349 break;
3350 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
3351 args = op->u.s_extended_operator.args;
3352 break;
3353 case DEMANGLE_COMPONENT_CAST:
3354 args = 1;
3355 break;
3358 switch (args)
3360 case 0:
3361 return d_make_comp (di, DEMANGLE_COMPONENT_NULLARY, op, NULL);
3363 case 1:
3365 struct demangle_component *operand;
3366 int suffix = 0;
3368 if (code && (code[0] == 'p' || code[0] == 'm')
3369 && code[1] == code[0])
3370 /* pp_ and mm_ are the prefix variants. */
3371 suffix = !d_check_char (di, '_');
3373 if (op->type == DEMANGLE_COMPONENT_CAST
3374 && d_check_char (di, '_'))
3375 operand = d_exprlist (di, 'E');
3376 else if (code && !strcmp (code, "sP"))
3377 operand = d_template_args_1 (di);
3378 else
3379 operand = d_expression_1 (di);
3381 if (suffix)
3382 /* Indicate the suffix variant for d_print_comp. */
3383 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
3384 d_make_comp (di,
3385 DEMANGLE_COMPONENT_BINARY_ARGS,
3386 operand, operand));
3387 else
3388 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
3389 operand);
3391 case 2:
3393 struct demangle_component *left;
3394 struct demangle_component *right;
3396 if (code == NULL)
3397 return NULL;
3398 if (op_is_new_cast (op))
3399 left = cplus_demangle_type (di);
3400 else if (code[0] == 'f')
3401 /* fold-expression. */
3402 left = d_operator_name (di);
3403 else
3404 left = d_expression_1 (di);
3405 if (!strcmp (code, "cl"))
3406 right = d_exprlist (di, 'E');
3407 else if (!strcmp (code, "dt") || !strcmp (code, "pt"))
3409 right = d_unqualified_name (di);
3410 if (d_peek_char (di) == 'I')
3411 right = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE,
3412 right, d_template_args (di));
3414 else
3415 right = d_expression_1 (di);
3417 return d_make_comp (di, DEMANGLE_COMPONENT_BINARY, op,
3418 d_make_comp (di,
3419 DEMANGLE_COMPONENT_BINARY_ARGS,
3420 left, right));
3422 case 3:
3424 struct demangle_component *first;
3425 struct demangle_component *second;
3426 struct demangle_component *third;
3428 if (code == NULL)
3429 return NULL;
3430 else if (!strcmp (code, "qu"))
3432 /* ?: expression. */
3433 first = d_expression_1 (di);
3434 second = d_expression_1 (di);
3435 third = d_expression_1 (di);
3436 if (third == NULL)
3437 return NULL;
3439 else if (code[0] == 'f')
3441 /* fold-expression. */
3442 first = d_operator_name (di);
3443 second = d_expression_1 (di);
3444 third = d_expression_1 (di);
3445 if (third == NULL)
3446 return NULL;
3448 else if (code[0] == 'n')
3450 /* new-expression. */
3451 if (code[1] != 'w' && code[1] != 'a')
3452 return NULL;
3453 first = d_exprlist (di, '_');
3454 second = cplus_demangle_type (di);
3455 if (d_peek_char (di) == 'E')
3457 d_advance (di, 1);
3458 third = NULL;
3460 else if (d_peek_char (di) == 'p'
3461 && d_peek_next_char (di) == 'i')
3463 /* Parenthesized initializer. */
3464 d_advance (di, 2);
3465 third = d_exprlist (di, 'E');
3467 else if (d_peek_char (di) == 'i'
3468 && d_peek_next_char (di) == 'l')
3469 /* initializer-list. */
3470 third = d_expression_1 (di);
3471 else
3472 return NULL;
3474 else
3475 return NULL;
3476 return d_make_comp (di, DEMANGLE_COMPONENT_TRINARY, op,
3477 d_make_comp (di,
3478 DEMANGLE_COMPONENT_TRINARY_ARG1,
3479 first,
3480 d_make_comp (di,
3481 DEMANGLE_COMPONENT_TRINARY_ARG2,
3482 second, third)));
3484 default:
3485 return NULL;
3490 static struct demangle_component *
3491 d_expression (struct d_info *di)
3493 struct demangle_component *ret;
3494 int was_expression = di->is_expression;
3496 di->is_expression = 1;
3497 ret = d_expression_1 (di);
3498 di->is_expression = was_expression;
3499 return ret;
3502 /* <expr-primary> ::= L <type> <(value) number> E
3503 ::= L <type> <(value) float> E
3504 ::= L <mangled-name> E
3507 static struct demangle_component *
3508 d_expr_primary (struct d_info *di)
3510 struct demangle_component *ret;
3512 if (! d_check_char (di, 'L'))
3513 return NULL;
3514 if (d_peek_char (di) == '_'
3515 /* Workaround for G++ bug; see comment in write_template_arg. */
3516 || d_peek_char (di) == 'Z')
3517 ret = cplus_demangle_mangled_name (di, 0);
3518 else
3520 struct demangle_component *type;
3521 enum demangle_component_type t;
3522 const char *s;
3524 type = cplus_demangle_type (di);
3525 if (type == NULL)
3526 return NULL;
3528 /* If we have a type we know how to print, we aren't going to
3529 print the type name itself. */
3530 if (type->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
3531 && type->u.s_builtin.type->print != D_PRINT_DEFAULT)
3532 di->expansion -= type->u.s_builtin.type->len;
3534 /* Rather than try to interpret the literal value, we just
3535 collect it as a string. Note that it's possible to have a
3536 floating point literal here. The ABI specifies that the
3537 format of such literals is machine independent. That's fine,
3538 but what's not fine is that versions of g++ up to 3.2 with
3539 -fabi-version=1 used upper case letters in the hex constant,
3540 and dumped out gcc's internal representation. That makes it
3541 hard to tell where the constant ends, and hard to dump the
3542 constant in any readable form anyhow. We don't attempt to
3543 handle these cases. */
3545 t = DEMANGLE_COMPONENT_LITERAL;
3546 if (d_peek_char (di) == 'n')
3548 t = DEMANGLE_COMPONENT_LITERAL_NEG;
3549 d_advance (di, 1);
3551 s = d_str (di);
3552 while (d_peek_char (di) != 'E')
3554 if (d_peek_char (di) == '\0')
3555 return NULL;
3556 d_advance (di, 1);
3558 ret = d_make_comp (di, t, type, d_make_name (di, s, d_str (di) - s));
3560 if (! d_check_char (di, 'E'))
3561 return NULL;
3562 return ret;
3565 /* <local-name> ::= Z <(function) encoding> E <(entity) name> [<discriminator>]
3566 ::= Z <(function) encoding> E s [<discriminator>]
3567 ::= Z <(function) encoding> E d [<parameter> number>] _ <entity name>
3570 static struct demangle_component *
3571 d_local_name (struct d_info *di, int top_level)
3573 struct demangle_component *function;
3574 struct demangle_component *name;
3576 if (! d_check_char (di, 'Z'))
3577 return NULL;
3579 function = d_encoding (di, 0);
3581 if (! d_check_char (di, 'E'))
3582 return NULL;
3584 if (d_peek_char (di) == 's')
3586 d_advance (di, 1);
3587 if (! d_discriminator (di))
3588 return NULL;
3589 name = d_make_name (di, "string literal", sizeof "string literal" - 1);
3591 else
3593 int num = -1;
3595 if (d_peek_char (di) == 'd')
3597 /* Default argument scope: d <number> _. */
3598 d_advance (di, 1);
3599 num = d_compact_number (di);
3600 if (num < 0)
3601 return NULL;
3604 name = d_name (di, 0);
3606 if (name
3607 /* Lambdas and unnamed types have internal discriminators
3608 and are not functions. */
3609 && name->type != DEMANGLE_COMPONENT_LAMBDA
3610 && name->type != DEMANGLE_COMPONENT_UNNAMED_TYPE)
3612 if (!top_level
3613 && d_peek_char (di) != 0 /* Not end of string. */
3614 && d_peek_char (di) != 'E' /* Not end of nested encoding. */
3615 && d_peek_char (di) != '_') /* Not discriminator. */
3617 struct demangle_component *args;
3619 args = d_bare_function_type (di, has_return_type (name));
3620 name = d_make_comp (di, DEMANGLE_COMPONENT_TYPED_NAME,
3621 name, args);
3624 /* Read and ignore an optional discriminator. */
3625 if (! d_discriminator (di))
3626 return NULL;
3629 if (num >= 0)
3630 name = d_make_default_arg (di, num, name);
3633 return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function, name);
3636 /* <discriminator> ::= _ <number> # when number < 10
3637 ::= __ <number> _ # when number >= 10
3639 <discriminator> ::= _ <number> # when number >=10
3640 is also accepted to support gcc versions that wrongly mangled that way.
3642 We demangle the discriminator, but we don't print it out. FIXME:
3643 We should print it out in verbose mode. */
3645 static int
3646 d_discriminator (struct d_info *di)
3648 int discrim, num_underscores = 1;
3650 if (d_peek_char (di) != '_')
3651 return 1;
3652 d_advance (di, 1);
3653 if (d_peek_char (di) == '_')
3655 ++num_underscores;
3656 d_advance (di, 1);
3659 discrim = d_number (di);
3660 if (discrim < 0)
3661 return 0;
3662 if (num_underscores > 1 && discrim >= 10)
3664 if (d_peek_char (di) == '_')
3665 d_advance (di, 1);
3666 else
3667 return 0;
3670 return 1;
3673 /* <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _ */
3675 static struct demangle_component *
3676 d_lambda (struct d_info *di)
3678 struct demangle_component *tl;
3679 struct demangle_component *ret;
3680 int num;
3682 if (! d_check_char (di, 'U'))
3683 return NULL;
3684 if (! d_check_char (di, 'l'))
3685 return NULL;
3687 tl = d_parmlist (di);
3688 if (tl == NULL)
3689 return NULL;
3691 if (! d_check_char (di, 'E'))
3692 return NULL;
3694 num = d_compact_number (di);
3695 if (num < 0)
3696 return NULL;
3698 ret = d_make_empty (di);
3699 if (ret)
3701 ret->type = DEMANGLE_COMPONENT_LAMBDA;
3702 ret->u.s_unary_num.sub = tl;
3703 ret->u.s_unary_num.num = num;
3706 if (! d_add_substitution (di, ret))
3707 return NULL;
3709 return ret;
3712 /* <unnamed-type-name> ::= Ut [ <nonnegative number> ] _ */
3714 static struct demangle_component *
3715 d_unnamed_type (struct d_info *di)
3717 struct demangle_component *ret;
3718 int num;
3720 if (! d_check_char (di, 'U'))
3721 return NULL;
3722 if (! d_check_char (di, 't'))
3723 return NULL;
3725 num = d_compact_number (di);
3726 if (num < 0)
3727 return NULL;
3729 ret = d_make_empty (di);
3730 if (ret)
3732 ret->type = DEMANGLE_COMPONENT_UNNAMED_TYPE;
3733 ret->u.s_number.number = num;
3736 if (! d_add_substitution (di, ret))
3737 return NULL;
3739 return ret;
3742 /* <clone-suffix> ::= [ . <clone-type-identifier> ] [ . <nonnegative number> ]*
3745 static struct demangle_component *
3746 d_clone_suffix (struct d_info *di, struct demangle_component *encoding)
3748 const char *suffix = d_str (di);
3749 const char *pend = suffix;
3750 struct demangle_component *n;
3752 if (*pend == '.' && (IS_LOWER (pend[1]) || pend[1] == '_'))
3754 pend += 2;
3755 while (IS_LOWER (*pend) || *pend == '_')
3756 ++pend;
3758 while (*pend == '.' && IS_DIGIT (pend[1]))
3760 pend += 2;
3761 while (IS_DIGIT (*pend))
3762 ++pend;
3764 d_advance (di, pend - suffix);
3765 n = d_make_name (di, suffix, pend - suffix);
3766 return d_make_comp (di, DEMANGLE_COMPONENT_CLONE, encoding, n);
3769 /* Add a new substitution. */
3771 static int
3772 d_add_substitution (struct d_info *di, struct demangle_component *dc)
3774 if (dc == NULL)
3775 return 0;
3776 if (di->next_sub >= di->num_subs)
3777 return 0;
3778 di->subs[di->next_sub] = dc;
3779 ++di->next_sub;
3780 return 1;
3783 /* <substitution> ::= S <seq-id> _
3784 ::= S_
3785 ::= St
3786 ::= Sa
3787 ::= Sb
3788 ::= Ss
3789 ::= Si
3790 ::= So
3791 ::= Sd
3793 If PREFIX is non-zero, then this type is being used as a prefix in
3794 a qualified name. In this case, for the standard substitutions, we
3795 need to check whether we are being used as a prefix for a
3796 constructor or destructor, and return a full template name.
3797 Otherwise we will get something like std::iostream::~iostream()
3798 which does not correspond particularly well to any function which
3799 actually appears in the source.
3802 static const struct d_standard_sub_info standard_subs[] =
3804 { 't', NL ("std"),
3805 NL ("std"),
3806 NULL, 0 },
3807 { 'a', NL ("std::allocator"),
3808 NL ("std::allocator"),
3809 NL ("allocator") },
3810 { 'b', NL ("std::basic_string"),
3811 NL ("std::basic_string"),
3812 NL ("basic_string") },
3813 { 's', NL ("std::string"),
3814 NL ("std::basic_string<char, std::char_traits<char>, std::allocator<char> >"),
3815 NL ("basic_string") },
3816 { 'i', NL ("std::istream"),
3817 NL ("std::basic_istream<char, std::char_traits<char> >"),
3818 NL ("basic_istream") },
3819 { 'o', NL ("std::ostream"),
3820 NL ("std::basic_ostream<char, std::char_traits<char> >"),
3821 NL ("basic_ostream") },
3822 { 'd', NL ("std::iostream"),
3823 NL ("std::basic_iostream<char, std::char_traits<char> >"),
3824 NL ("basic_iostream") }
3827 static struct demangle_component *
3828 d_substitution (struct d_info *di, int prefix)
3830 char c;
3832 if (! d_check_char (di, 'S'))
3833 return NULL;
3835 c = d_next_char (di);
3836 if (c == '_' || IS_DIGIT (c) || IS_UPPER (c))
3838 unsigned int id;
3840 id = 0;
3841 if (c != '_')
3845 unsigned int new_id;
3847 if (IS_DIGIT (c))
3848 new_id = id * 36 + c - '0';
3849 else if (IS_UPPER (c))
3850 new_id = id * 36 + c - 'A' + 10;
3851 else
3852 return NULL;
3853 if (new_id < id)
3854 return NULL;
3855 id = new_id;
3856 c = d_next_char (di);
3858 while (c != '_');
3860 ++id;
3863 if (id >= (unsigned int) di->next_sub)
3864 return NULL;
3866 return di->subs[id];
3868 else
3870 int verbose;
3871 const struct d_standard_sub_info *p;
3872 const struct d_standard_sub_info *pend;
3874 verbose = (di->options & DMGL_VERBOSE) != 0;
3875 if (! verbose && prefix)
3877 char peek;
3879 peek = d_peek_char (di);
3880 if (peek == 'C' || peek == 'D')
3881 verbose = 1;
3884 pend = (&standard_subs[0]
3885 + sizeof standard_subs / sizeof standard_subs[0]);
3886 for (p = &standard_subs[0]; p < pend; ++p)
3888 if (c == p->code)
3890 const char *s;
3891 int len;
3892 struct demangle_component *dc;
3894 if (p->set_last_name != NULL)
3895 di->last_name = d_make_sub (di, p->set_last_name,
3896 p->set_last_name_len);
3897 if (verbose)
3899 s = p->full_expansion;
3900 len = p->full_len;
3902 else
3904 s = p->simple_expansion;
3905 len = p->simple_len;
3907 di->expansion += len;
3908 dc = d_make_sub (di, s, len);
3909 if (d_peek_char (di) == 'B')
3911 /* If there are ABI tags on the abbreviation, it becomes
3912 a substitution candidate. */
3913 dc = d_abi_tags (di, dc);
3914 if (! d_add_substitution (di, dc))
3915 return NULL;
3917 return dc;
3921 return NULL;
3925 static void
3926 d_checkpoint (struct d_info *di, struct d_info_checkpoint *checkpoint)
3928 checkpoint->n = di->n;
3929 checkpoint->next_comp = di->next_comp;
3930 checkpoint->next_sub = di->next_sub;
3931 checkpoint->expansion = di->expansion;
3934 static void
3935 d_backtrack (struct d_info *di, struct d_info_checkpoint *checkpoint)
3937 di->n = checkpoint->n;
3938 di->next_comp = checkpoint->next_comp;
3939 di->next_sub = checkpoint->next_sub;
3940 di->expansion = checkpoint->expansion;
3943 /* Initialize a growable string. */
3945 static void
3946 d_growable_string_init (struct d_growable_string *dgs, size_t estimate)
3948 dgs->buf = NULL;
3949 dgs->len = 0;
3950 dgs->alc = 0;
3951 dgs->allocation_failure = 0;
3953 if (estimate > 0)
3954 d_growable_string_resize (dgs, estimate);
3957 /* Grow a growable string to a given size. */
3959 static inline void
3960 d_growable_string_resize (struct d_growable_string *dgs, size_t need)
3962 size_t newalc;
3963 char *newbuf;
3965 if (dgs->allocation_failure)
3966 return;
3968 /* Start allocation at two bytes to avoid any possibility of confusion
3969 with the special value of 1 used as a return in *palc to indicate
3970 allocation failures. */
3971 newalc = dgs->alc > 0 ? dgs->alc : 2;
3972 while (newalc < need)
3973 newalc <<= 1;
3975 newbuf = (char *) realloc (dgs->buf, newalc);
3976 if (newbuf == NULL)
3978 free (dgs->buf);
3979 dgs->buf = NULL;
3980 dgs->len = 0;
3981 dgs->alc = 0;
3982 dgs->allocation_failure = 1;
3983 return;
3985 dgs->buf = newbuf;
3986 dgs->alc = newalc;
3989 /* Append a buffer to a growable string. */
3991 static inline void
3992 d_growable_string_append_buffer (struct d_growable_string *dgs,
3993 const char *s, size_t l)
3995 size_t need;
3997 need = dgs->len + l + 1;
3998 if (need > dgs->alc)
3999 d_growable_string_resize (dgs, need);
4001 if (dgs->allocation_failure)
4002 return;
4004 memcpy (dgs->buf + dgs->len, s, l);
4005 dgs->buf[dgs->len + l] = '\0';
4006 dgs->len += l;
4009 /* Bridge growable strings to the callback mechanism. */
4011 static void
4012 d_growable_string_callback_adapter (const char *s, size_t l, void *opaque)
4014 struct d_growable_string *dgs = (struct d_growable_string*) opaque;
4016 d_growable_string_append_buffer (dgs, s, l);
4019 /* Walk the tree, counting the number of templates encountered, and
4020 the number of times a scope might be saved. These counts will be
4021 used to allocate data structures for d_print_comp, so the logic
4022 here must mirror the logic d_print_comp will use. It is not
4023 important that the resulting numbers are exact, so long as they
4024 are larger than the actual numbers encountered. */
4026 static void
4027 d_count_templates_scopes (int *num_templates, int *num_scopes,
4028 const struct demangle_component *dc)
4030 if (dc == NULL)
4031 return;
4033 switch (dc->type)
4035 case DEMANGLE_COMPONENT_NAME:
4036 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
4037 case DEMANGLE_COMPONENT_FUNCTION_PARAM:
4038 case DEMANGLE_COMPONENT_SUB_STD:
4039 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
4040 case DEMANGLE_COMPONENT_OPERATOR:
4041 case DEMANGLE_COMPONENT_CHARACTER:
4042 case DEMANGLE_COMPONENT_NUMBER:
4043 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
4044 break;
4046 case DEMANGLE_COMPONENT_TEMPLATE:
4047 (*num_templates)++;
4048 goto recurse_left_right;
4050 case DEMANGLE_COMPONENT_REFERENCE:
4051 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
4052 if (d_left (dc)->type == DEMANGLE_COMPONENT_TEMPLATE_PARAM)
4053 (*num_scopes)++;
4054 goto recurse_left_right;
4056 case DEMANGLE_COMPONENT_QUAL_NAME:
4057 case DEMANGLE_COMPONENT_LOCAL_NAME:
4058 case DEMANGLE_COMPONENT_TYPED_NAME:
4059 case DEMANGLE_COMPONENT_VTABLE:
4060 case DEMANGLE_COMPONENT_VTT:
4061 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
4062 case DEMANGLE_COMPONENT_TYPEINFO:
4063 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
4064 case DEMANGLE_COMPONENT_TYPEINFO_FN:
4065 case DEMANGLE_COMPONENT_THUNK:
4066 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
4067 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
4068 case DEMANGLE_COMPONENT_JAVA_CLASS:
4069 case DEMANGLE_COMPONENT_GUARD:
4070 case DEMANGLE_COMPONENT_TLS_INIT:
4071 case DEMANGLE_COMPONENT_TLS_WRAPPER:
4072 case DEMANGLE_COMPONENT_REFTEMP:
4073 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
4074 case DEMANGLE_COMPONENT_RESTRICT:
4075 case DEMANGLE_COMPONENT_VOLATILE:
4076 case DEMANGLE_COMPONENT_CONST:
4077 case DEMANGLE_COMPONENT_RESTRICT_THIS:
4078 case DEMANGLE_COMPONENT_VOLATILE_THIS:
4079 case DEMANGLE_COMPONENT_CONST_THIS:
4080 case DEMANGLE_COMPONENT_REFERENCE_THIS:
4081 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
4082 case DEMANGLE_COMPONENT_TRANSACTION_SAFE:
4083 case DEMANGLE_COMPONENT_NOEXCEPT:
4084 case DEMANGLE_COMPONENT_THROW_SPEC:
4085 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
4086 case DEMANGLE_COMPONENT_POINTER:
4087 case DEMANGLE_COMPONENT_COMPLEX:
4088 case DEMANGLE_COMPONENT_IMAGINARY:
4089 case DEMANGLE_COMPONENT_VENDOR_TYPE:
4090 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
4091 case DEMANGLE_COMPONENT_ARRAY_TYPE:
4092 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
4093 case DEMANGLE_COMPONENT_VECTOR_TYPE:
4094 case DEMANGLE_COMPONENT_ARGLIST:
4095 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
4096 case DEMANGLE_COMPONENT_INITIALIZER_LIST:
4097 case DEMANGLE_COMPONENT_CAST:
4098 case DEMANGLE_COMPONENT_CONVERSION:
4099 case DEMANGLE_COMPONENT_NULLARY:
4100 case DEMANGLE_COMPONENT_UNARY:
4101 case DEMANGLE_COMPONENT_BINARY:
4102 case DEMANGLE_COMPONENT_BINARY_ARGS:
4103 case DEMANGLE_COMPONENT_TRINARY:
4104 case DEMANGLE_COMPONENT_TRINARY_ARG1:
4105 case DEMANGLE_COMPONENT_TRINARY_ARG2:
4106 case DEMANGLE_COMPONENT_LITERAL:
4107 case DEMANGLE_COMPONENT_LITERAL_NEG:
4108 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
4109 case DEMANGLE_COMPONENT_COMPOUND_NAME:
4110 case DEMANGLE_COMPONENT_DECLTYPE:
4111 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
4112 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
4113 case DEMANGLE_COMPONENT_PACK_EXPANSION:
4114 case DEMANGLE_COMPONENT_TAGGED_NAME:
4115 case DEMANGLE_COMPONENT_CLONE:
4116 recurse_left_right:
4117 d_count_templates_scopes (num_templates, num_scopes,
4118 d_left (dc));
4119 d_count_templates_scopes (num_templates, num_scopes,
4120 d_right (dc));
4121 break;
4123 case DEMANGLE_COMPONENT_CTOR:
4124 d_count_templates_scopes (num_templates, num_scopes,
4125 dc->u.s_ctor.name);
4126 break;
4128 case DEMANGLE_COMPONENT_DTOR:
4129 d_count_templates_scopes (num_templates, num_scopes,
4130 dc->u.s_dtor.name);
4131 break;
4133 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
4134 d_count_templates_scopes (num_templates, num_scopes,
4135 dc->u.s_extended_operator.name);
4136 break;
4138 case DEMANGLE_COMPONENT_FIXED_TYPE:
4139 d_count_templates_scopes (num_templates, num_scopes,
4140 dc->u.s_fixed.length);
4141 break;
4143 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
4144 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
4145 d_count_templates_scopes (num_templates, num_scopes,
4146 d_left (dc));
4147 break;
4149 case DEMANGLE_COMPONENT_LAMBDA:
4150 case DEMANGLE_COMPONENT_DEFAULT_ARG:
4151 d_count_templates_scopes (num_templates, num_scopes,
4152 dc->u.s_unary_num.sub);
4153 break;
4157 /* Initialize a print information structure. */
4159 static void
4160 d_print_init (struct d_print_info *dpi, demangle_callbackref callback,
4161 void *opaque, const struct demangle_component *dc)
4163 dpi->len = 0;
4164 dpi->last_char = '\0';
4165 dpi->templates = NULL;
4166 dpi->modifiers = NULL;
4167 dpi->pack_index = 0;
4168 dpi->flush_count = 0;
4170 dpi->callback = callback;
4171 dpi->opaque = opaque;
4173 dpi->demangle_failure = 0;
4174 dpi->recursion = 0;
4175 dpi->is_lambda_arg = 0;
4177 dpi->component_stack = NULL;
4179 dpi->saved_scopes = NULL;
4180 dpi->next_saved_scope = 0;
4181 dpi->num_saved_scopes = 0;
4183 dpi->copy_templates = NULL;
4184 dpi->next_copy_template = 0;
4185 dpi->num_copy_templates = 0;
4187 d_count_templates_scopes (&dpi->num_copy_templates,
4188 &dpi->num_saved_scopes, dc);
4189 dpi->num_copy_templates *= dpi->num_saved_scopes;
4191 dpi->current_template = NULL;
4194 /* Indicate that an error occurred during printing, and test for error. */
4196 static inline void
4197 d_print_error (struct d_print_info *dpi)
4199 dpi->demangle_failure = 1;
4202 static inline int
4203 d_print_saw_error (struct d_print_info *dpi)
4205 return dpi->demangle_failure != 0;
4208 /* Flush buffered characters to the callback. */
4210 static inline void
4211 d_print_flush (struct d_print_info *dpi)
4213 dpi->buf[dpi->len] = '\0';
4214 dpi->callback (dpi->buf, dpi->len, dpi->opaque);
4215 dpi->len = 0;
4216 dpi->flush_count++;
4219 /* Append characters and buffers for printing. */
4221 static inline void
4222 d_append_char (struct d_print_info *dpi, char c)
4224 if (dpi->len == sizeof (dpi->buf) - 1)
4225 d_print_flush (dpi);
4227 dpi->buf[dpi->len++] = c;
4228 dpi->last_char = c;
4231 static inline void
4232 d_append_buffer (struct d_print_info *dpi, const char *s, size_t l)
4234 size_t i;
4236 for (i = 0; i < l; i++)
4237 d_append_char (dpi, s[i]);
4240 static inline void
4241 d_append_string (struct d_print_info *dpi, const char *s)
4243 d_append_buffer (dpi, s, strlen (s));
4246 static inline void
4247 d_append_num (struct d_print_info *dpi, int l)
4249 char buf[25];
4250 sprintf (buf,"%d", l);
4251 d_append_string (dpi, buf);
4254 static inline char
4255 d_last_char (struct d_print_info *dpi)
4257 return dpi->last_char;
4260 /* Turn components into a human readable string. OPTIONS is the
4261 options bits passed to the demangler. DC is the tree to print.
4262 CALLBACK is a function to call to flush demangled string segments
4263 as they fill the intermediate buffer, and OPAQUE is a generalized
4264 callback argument. On success, this returns 1. On failure,
4265 it returns 0, indicating a bad parse. It does not use heap
4266 memory to build an output string, so cannot encounter memory
4267 allocation failure. */
4269 CP_STATIC_IF_GLIBCPP_V3
4271 cplus_demangle_print_callback (int options,
4272 struct demangle_component *dc,
4273 demangle_callbackref callback, void *opaque)
4275 struct d_print_info dpi;
4277 d_print_init (&dpi, callback, opaque, dc);
4280 #ifdef CP_DYNAMIC_ARRAYS
4281 /* Avoid zero-length VLAs, which are prohibited by the C99 standard
4282 and flagged as errors by Address Sanitizer. */
4283 __extension__ struct d_saved_scope scopes[(dpi.num_saved_scopes > 0)
4284 ? dpi.num_saved_scopes : 1];
4285 __extension__ struct d_print_template temps[(dpi.num_copy_templates > 0)
4286 ? dpi.num_copy_templates : 1];
4288 dpi.saved_scopes = scopes;
4289 dpi.copy_templates = temps;
4290 #else
4291 dpi.saved_scopes = alloca (dpi.num_saved_scopes
4292 * sizeof (*dpi.saved_scopes));
4293 dpi.copy_templates = alloca (dpi.num_copy_templates
4294 * sizeof (*dpi.copy_templates));
4295 #endif
4297 d_print_comp (&dpi, options, dc);
4300 d_print_flush (&dpi);
4302 return ! d_print_saw_error (&dpi);
4305 /* Turn components into a human readable string. OPTIONS is the
4306 options bits passed to the demangler. DC is the tree to print.
4307 ESTIMATE is a guess at the length of the result. This returns a
4308 string allocated by malloc, or NULL on error. On success, this
4309 sets *PALC to the size of the allocated buffer. On failure, this
4310 sets *PALC to 0 for a bad parse, or to 1 for a memory allocation
4311 failure. */
4313 CP_STATIC_IF_GLIBCPP_V3
4314 char *
4315 cplus_demangle_print (int options, struct demangle_component *dc,
4316 int estimate, size_t *palc)
4318 struct d_growable_string dgs;
4320 d_growable_string_init (&dgs, estimate);
4322 if (! cplus_demangle_print_callback (options, dc,
4323 d_growable_string_callback_adapter,
4324 &dgs))
4326 free (dgs.buf);
4327 *palc = 0;
4328 return NULL;
4331 *palc = dgs.allocation_failure ? 1 : dgs.alc;
4332 return dgs.buf;
4335 /* Returns the I'th element of the template arglist ARGS, or NULL on
4336 failure. If I is negative, return the entire arglist. */
4338 static struct demangle_component *
4339 d_index_template_argument (struct demangle_component *args, int i)
4341 struct demangle_component *a;
4343 if (i < 0)
4344 /* Print the whole argument pack. */
4345 return args;
4347 for (a = args;
4348 a != NULL;
4349 a = d_right (a))
4351 if (a->type != DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4352 return NULL;
4353 if (i <= 0)
4354 break;
4355 --i;
4357 if (i != 0 || a == NULL)
4358 return NULL;
4360 return d_left (a);
4363 /* Returns the template argument from the current context indicated by DC,
4364 which is a DEMANGLE_COMPONENT_TEMPLATE_PARAM, or NULL. */
4366 static struct demangle_component *
4367 d_lookup_template_argument (struct d_print_info *dpi,
4368 const struct demangle_component *dc)
4370 if (dpi->templates == NULL)
4372 d_print_error (dpi);
4373 return NULL;
4376 return d_index_template_argument
4377 (d_right (dpi->templates->template_decl),
4378 dc->u.s_number.number);
4381 /* Returns a template argument pack used in DC (any will do), or NULL. */
4383 static struct demangle_component *
4384 d_find_pack (struct d_print_info *dpi,
4385 const struct demangle_component *dc)
4387 struct demangle_component *a;
4388 if (dc == NULL)
4389 return NULL;
4391 switch (dc->type)
4393 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
4394 a = d_lookup_template_argument (dpi, dc);
4395 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4396 return a;
4397 return NULL;
4399 case DEMANGLE_COMPONENT_PACK_EXPANSION:
4400 return NULL;
4402 case DEMANGLE_COMPONENT_LAMBDA:
4403 case DEMANGLE_COMPONENT_NAME:
4404 case DEMANGLE_COMPONENT_TAGGED_NAME:
4405 case DEMANGLE_COMPONENT_OPERATOR:
4406 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
4407 case DEMANGLE_COMPONENT_SUB_STD:
4408 case DEMANGLE_COMPONENT_CHARACTER:
4409 case DEMANGLE_COMPONENT_FUNCTION_PARAM:
4410 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
4411 case DEMANGLE_COMPONENT_FIXED_TYPE:
4412 case DEMANGLE_COMPONENT_DEFAULT_ARG:
4413 case DEMANGLE_COMPONENT_NUMBER:
4414 return NULL;
4416 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
4417 return d_find_pack (dpi, dc->u.s_extended_operator.name);
4418 case DEMANGLE_COMPONENT_CTOR:
4419 return d_find_pack (dpi, dc->u.s_ctor.name);
4420 case DEMANGLE_COMPONENT_DTOR:
4421 return d_find_pack (dpi, dc->u.s_dtor.name);
4423 default:
4424 a = d_find_pack (dpi, d_left (dc));
4425 if (a)
4426 return a;
4427 return d_find_pack (dpi, d_right (dc));
4431 /* Returns the length of the template argument pack DC. */
4433 static int
4434 d_pack_length (const struct demangle_component *dc)
4436 int count = 0;
4437 while (dc && dc->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
4438 && d_left (dc) != NULL)
4440 ++count;
4441 dc = d_right (dc);
4443 return count;
4446 /* Returns the number of template args in DC, expanding any pack expansions
4447 found there. */
4449 static int
4450 d_args_length (struct d_print_info *dpi, const struct demangle_component *dc)
4452 int count = 0;
4453 for (; dc && dc->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST;
4454 dc = d_right (dc))
4456 struct demangle_component *elt = d_left (dc);
4457 if (elt == NULL)
4458 break;
4459 if (elt->type == DEMANGLE_COMPONENT_PACK_EXPANSION)
4461 struct demangle_component *a = d_find_pack (dpi, d_left (elt));
4462 count += d_pack_length (a);
4464 else
4465 ++count;
4467 return count;
4470 /* DC is a component of a mangled expression. Print it, wrapped in parens
4471 if needed. */
4473 static void
4474 d_print_subexpr (struct d_print_info *dpi, int options,
4475 struct demangle_component *dc)
4477 int simple = 0;
4478 if (dc->type == DEMANGLE_COMPONENT_NAME
4479 || dc->type == DEMANGLE_COMPONENT_QUAL_NAME
4480 || dc->type == DEMANGLE_COMPONENT_INITIALIZER_LIST
4481 || dc->type == DEMANGLE_COMPONENT_FUNCTION_PARAM)
4482 simple = 1;
4483 if (!simple)
4484 d_append_char (dpi, '(');
4485 d_print_comp (dpi, options, dc);
4486 if (!simple)
4487 d_append_char (dpi, ')');
4490 /* Save the current scope. */
4492 static void
4493 d_save_scope (struct d_print_info *dpi,
4494 const struct demangle_component *container)
4496 struct d_saved_scope *scope;
4497 struct d_print_template *src, **link;
4499 if (dpi->next_saved_scope >= dpi->num_saved_scopes)
4501 d_print_error (dpi);
4502 return;
4504 scope = &dpi->saved_scopes[dpi->next_saved_scope];
4505 dpi->next_saved_scope++;
4507 scope->container = container;
4508 link = &scope->templates;
4510 for (src = dpi->templates; src != NULL; src = src->next)
4512 struct d_print_template *dst;
4514 if (dpi->next_copy_template >= dpi->num_copy_templates)
4516 d_print_error (dpi);
4517 return;
4519 dst = &dpi->copy_templates[dpi->next_copy_template];
4520 dpi->next_copy_template++;
4522 dst->template_decl = src->template_decl;
4523 *link = dst;
4524 link = &dst->next;
4527 *link = NULL;
4530 /* Attempt to locate a previously saved scope. Returns NULL if no
4531 corresponding saved scope was found. */
4533 static struct d_saved_scope *
4534 d_get_saved_scope (struct d_print_info *dpi,
4535 const struct demangle_component *container)
4537 int i;
4539 for (i = 0; i < dpi->next_saved_scope; i++)
4540 if (dpi->saved_scopes[i].container == container)
4541 return &dpi->saved_scopes[i];
4543 return NULL;
4546 /* If DC is a C++17 fold-expression, print it and return true; otherwise
4547 return false. */
4549 static int
4550 d_maybe_print_fold_expression (struct d_print_info *dpi, int options,
4551 struct demangle_component *dc)
4553 struct demangle_component *ops, *operator_, *op1, *op2;
4554 int save_idx;
4556 const char *fold_code = d_left (dc)->u.s_operator.op->code;
4557 if (fold_code[0] != 'f')
4558 return 0;
4560 ops = d_right (dc);
4561 operator_ = d_left (ops);
4562 op1 = d_right (ops);
4563 op2 = 0;
4564 if (op1->type == DEMANGLE_COMPONENT_TRINARY_ARG2)
4566 op2 = d_right (op1);
4567 op1 = d_left (op1);
4570 /* Print the whole pack. */
4571 save_idx = dpi->pack_index;
4572 dpi->pack_index = -1;
4574 switch (fold_code[1])
4576 /* Unary left fold, (... + X). */
4577 case 'l':
4578 d_append_string (dpi, "(...");
4579 d_print_expr_op (dpi, options, operator_);
4580 d_print_subexpr (dpi, options, op1);
4581 d_append_char (dpi, ')');
4582 break;
4584 /* Unary right fold, (X + ...). */
4585 case 'r':
4586 d_append_char (dpi, '(');
4587 d_print_subexpr (dpi, options, op1);
4588 d_print_expr_op (dpi, options, operator_);
4589 d_append_string (dpi, "...)");
4590 break;
4592 /* Binary left fold, (42 + ... + X). */
4593 case 'L':
4594 /* Binary right fold, (X + ... + 42). */
4595 case 'R':
4596 d_append_char (dpi, '(');
4597 d_print_subexpr (dpi, options, op1);
4598 d_print_expr_op (dpi, options, operator_);
4599 d_append_string (dpi, "...");
4600 d_print_expr_op (dpi, options, operator_);
4601 d_print_subexpr (dpi, options, op2);
4602 d_append_char (dpi, ')');
4603 break;
4606 dpi->pack_index = save_idx;
4607 return 1;
4610 /* Subroutine to handle components. */
4612 static void
4613 d_print_comp_inner (struct d_print_info *dpi, int options,
4614 struct demangle_component *dc)
4616 /* Magic variable to let reference smashing skip over the next modifier
4617 without needing to modify *dc. */
4618 struct demangle_component *mod_inner = NULL;
4620 /* Variable used to store the current templates while a previously
4621 captured scope is used. */
4622 struct d_print_template *saved_templates;
4624 /* Nonzero if templates have been stored in the above variable. */
4625 int need_template_restore = 0;
4627 if (dc == NULL)
4629 d_print_error (dpi);
4630 return;
4632 if (d_print_saw_error (dpi))
4633 return;
4635 switch (dc->type)
4637 case DEMANGLE_COMPONENT_NAME:
4638 if ((options & DMGL_JAVA) == 0)
4639 d_append_buffer (dpi, dc->u.s_name.s, dc->u.s_name.len);
4640 else
4641 d_print_java_identifier (dpi, dc->u.s_name.s, dc->u.s_name.len);
4642 return;
4644 case DEMANGLE_COMPONENT_TAGGED_NAME:
4645 d_print_comp (dpi, options, d_left (dc));
4646 d_append_string (dpi, "[abi:");
4647 d_print_comp (dpi, options, d_right (dc));
4648 d_append_char (dpi, ']');
4649 return;
4651 case DEMANGLE_COMPONENT_QUAL_NAME:
4652 case DEMANGLE_COMPONENT_LOCAL_NAME:
4653 d_print_comp (dpi, options, d_left (dc));
4654 if ((options & DMGL_JAVA) == 0)
4655 d_append_string (dpi, "::");
4656 else
4657 d_append_char (dpi, '.');
4659 struct demangle_component *local_name = d_right (dc);
4660 if (local_name->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
4662 d_append_string (dpi, "{default arg#");
4663 d_append_num (dpi, local_name->u.s_unary_num.num + 1);
4664 d_append_string (dpi, "}::");
4665 local_name = local_name->u.s_unary_num.sub;
4667 d_print_comp (dpi, options, local_name);
4669 return;
4671 case DEMANGLE_COMPONENT_TYPED_NAME:
4673 struct d_print_mod *hold_modifiers;
4674 struct demangle_component *typed_name;
4675 struct d_print_mod adpm[4];
4676 unsigned int i;
4677 struct d_print_template dpt;
4679 /* Pass the name down to the type so that it can be printed in
4680 the right place for the type. We also have to pass down
4681 any CV-qualifiers, which apply to the this parameter. */
4682 hold_modifiers = dpi->modifiers;
4683 dpi->modifiers = 0;
4684 i = 0;
4685 typed_name = d_left (dc);
4686 while (typed_name != NULL)
4688 if (i >= sizeof adpm / sizeof adpm[0])
4690 d_print_error (dpi);
4691 return;
4694 adpm[i].next = dpi->modifiers;
4695 dpi->modifiers = &adpm[i];
4696 adpm[i].mod = typed_name;
4697 adpm[i].printed = 0;
4698 adpm[i].templates = dpi->templates;
4699 ++i;
4701 if (!is_fnqual_component_type (typed_name->type))
4702 break;
4704 typed_name = d_left (typed_name);
4707 if (typed_name == NULL)
4709 d_print_error (dpi);
4710 return;
4713 /* If typed_name is a template, then it applies to the
4714 function type as well. */
4715 if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
4717 dpt.next = dpi->templates;
4718 dpi->templates = &dpt;
4719 dpt.template_decl = typed_name;
4722 /* If typed_name is a DEMANGLE_COMPONENT_LOCAL_NAME, then
4723 there may be CV-qualifiers on its right argument which
4724 really apply here; this happens when parsing a class which
4725 is local to a function. */
4726 if (typed_name->type == DEMANGLE_COMPONENT_LOCAL_NAME)
4728 struct demangle_component *local_name;
4730 local_name = d_right (typed_name);
4731 if (local_name->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
4732 local_name = local_name->u.s_unary_num.sub;
4733 if (local_name == NULL)
4735 d_print_error (dpi);
4736 return;
4738 while (is_fnqual_component_type (local_name->type))
4740 if (i >= sizeof adpm / sizeof adpm[0])
4742 d_print_error (dpi);
4743 return;
4746 adpm[i] = adpm[i - 1];
4747 adpm[i].next = &adpm[i - 1];
4748 dpi->modifiers = &adpm[i];
4750 adpm[i - 1].mod = local_name;
4751 adpm[i - 1].printed = 0;
4752 adpm[i - 1].templates = dpi->templates;
4753 ++i;
4755 local_name = d_left (local_name);
4759 d_print_comp (dpi, options, d_right (dc));
4761 if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
4762 dpi->templates = dpt.next;
4764 /* If the modifiers didn't get printed by the type, print them
4765 now. */
4766 while (i > 0)
4768 --i;
4769 if (! adpm[i].printed)
4771 d_append_char (dpi, ' ');
4772 d_print_mod (dpi, options, adpm[i].mod);
4776 dpi->modifiers = hold_modifiers;
4778 return;
4781 case DEMANGLE_COMPONENT_TEMPLATE:
4783 struct d_print_mod *hold_dpm;
4784 struct demangle_component *dcl;
4785 const struct demangle_component *hold_current;
4787 /* This template may need to be referenced by a cast operator
4788 contained in its subtree. */
4789 hold_current = dpi->current_template;
4790 dpi->current_template = dc;
4792 /* Don't push modifiers into a template definition. Doing so
4793 could give the wrong definition for a template argument.
4794 Instead, treat the template essentially as a name. */
4796 hold_dpm = dpi->modifiers;
4797 dpi->modifiers = NULL;
4799 dcl = d_left (dc);
4801 if ((options & DMGL_JAVA) != 0
4802 && dcl->type == DEMANGLE_COMPONENT_NAME
4803 && dcl->u.s_name.len == 6
4804 && strncmp (dcl->u.s_name.s, "JArray", 6) == 0)
4806 /* Special-case Java arrays, so that JArray<TYPE> appears
4807 instead as TYPE[]. */
4809 d_print_comp (dpi, options, d_right (dc));
4810 d_append_string (dpi, "[]");
4812 else
4814 d_print_comp (dpi, options, dcl);
4815 if (d_last_char (dpi) == '<')
4816 d_append_char (dpi, ' ');
4817 d_append_char (dpi, '<');
4818 d_print_comp (dpi, options, d_right (dc));
4819 /* Avoid generating two consecutive '>' characters, to avoid
4820 the C++ syntactic ambiguity. */
4821 if (d_last_char (dpi) == '>')
4822 d_append_char (dpi, ' ');
4823 d_append_char (dpi, '>');
4826 dpi->modifiers = hold_dpm;
4827 dpi->current_template = hold_current;
4829 return;
4832 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
4833 if (dpi->is_lambda_arg)
4835 /* Show the template parm index, as that's how g++ displays
4836 these, and future proofs us against potential
4837 '[]<typename T> (T *a, T *b) {...}'. */
4838 d_append_buffer (dpi, "auto:", 5);
4839 d_append_num (dpi, dc->u.s_number.number + 1);
4841 else
4843 struct d_print_template *hold_dpt;
4844 struct demangle_component *a = d_lookup_template_argument (dpi, dc);
4846 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4847 a = d_index_template_argument (a, dpi->pack_index);
4849 if (a == NULL)
4851 d_print_error (dpi);
4852 return;
4855 /* While processing this parameter, we need to pop the list
4856 of templates. This is because the template parameter may
4857 itself be a reference to a parameter of an outer
4858 template. */
4860 hold_dpt = dpi->templates;
4861 dpi->templates = hold_dpt->next;
4863 d_print_comp (dpi, options, a);
4865 dpi->templates = hold_dpt;
4867 return;
4869 case DEMANGLE_COMPONENT_CTOR:
4870 d_print_comp (dpi, options, dc->u.s_ctor.name);
4871 return;
4873 case DEMANGLE_COMPONENT_DTOR:
4874 d_append_char (dpi, '~');
4875 d_print_comp (dpi, options, dc->u.s_dtor.name);
4876 return;
4878 case DEMANGLE_COMPONENT_VTABLE:
4879 d_append_string (dpi, "vtable for ");
4880 d_print_comp (dpi, options, d_left (dc));
4881 return;
4883 case DEMANGLE_COMPONENT_VTT:
4884 d_append_string (dpi, "VTT for ");
4885 d_print_comp (dpi, options, d_left (dc));
4886 return;
4888 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
4889 d_append_string (dpi, "construction vtable for ");
4890 d_print_comp (dpi, options, d_left (dc));
4891 d_append_string (dpi, "-in-");
4892 d_print_comp (dpi, options, d_right (dc));
4893 return;
4895 case DEMANGLE_COMPONENT_TYPEINFO:
4896 d_append_string (dpi, "typeinfo for ");
4897 d_print_comp (dpi, options, d_left (dc));
4898 return;
4900 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
4901 d_append_string (dpi, "typeinfo name for ");
4902 d_print_comp (dpi, options, d_left (dc));
4903 return;
4905 case DEMANGLE_COMPONENT_TYPEINFO_FN:
4906 d_append_string (dpi, "typeinfo fn for ");
4907 d_print_comp (dpi, options, d_left (dc));
4908 return;
4910 case DEMANGLE_COMPONENT_THUNK:
4911 d_append_string (dpi, "non-virtual thunk to ");
4912 d_print_comp (dpi, options, d_left (dc));
4913 return;
4915 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
4916 d_append_string (dpi, "virtual thunk to ");
4917 d_print_comp (dpi, options, d_left (dc));
4918 return;
4920 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
4921 d_append_string (dpi, "covariant return thunk to ");
4922 d_print_comp (dpi, options, d_left (dc));
4923 return;
4925 case DEMANGLE_COMPONENT_JAVA_CLASS:
4926 d_append_string (dpi, "java Class for ");
4927 d_print_comp (dpi, options, d_left (dc));
4928 return;
4930 case DEMANGLE_COMPONENT_GUARD:
4931 d_append_string (dpi, "guard variable for ");
4932 d_print_comp (dpi, options, d_left (dc));
4933 return;
4935 case DEMANGLE_COMPONENT_TLS_INIT:
4936 d_append_string (dpi, "TLS init function for ");
4937 d_print_comp (dpi, options, d_left (dc));
4938 return;
4940 case DEMANGLE_COMPONENT_TLS_WRAPPER:
4941 d_append_string (dpi, "TLS wrapper function for ");
4942 d_print_comp (dpi, options, d_left (dc));
4943 return;
4945 case DEMANGLE_COMPONENT_REFTEMP:
4946 d_append_string (dpi, "reference temporary #");
4947 d_print_comp (dpi, options, d_right (dc));
4948 d_append_string (dpi, " for ");
4949 d_print_comp (dpi, options, d_left (dc));
4950 return;
4952 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
4953 d_append_string (dpi, "hidden alias for ");
4954 d_print_comp (dpi, options, d_left (dc));
4955 return;
4957 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
4958 d_append_string (dpi, "transaction clone for ");
4959 d_print_comp (dpi, options, d_left (dc));
4960 return;
4962 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
4963 d_append_string (dpi, "non-transaction clone for ");
4964 d_print_comp (dpi, options, d_left (dc));
4965 return;
4967 case DEMANGLE_COMPONENT_SUB_STD:
4968 d_append_buffer (dpi, dc->u.s_string.string, dc->u.s_string.len);
4969 return;
4971 case DEMANGLE_COMPONENT_RESTRICT:
4972 case DEMANGLE_COMPONENT_VOLATILE:
4973 case DEMANGLE_COMPONENT_CONST:
4975 struct d_print_mod *pdpm;
4977 /* When printing arrays, it's possible to have cases where the
4978 same CV-qualifier gets pushed on the stack multiple times.
4979 We only need to print it once. */
4981 for (pdpm = dpi->modifiers; pdpm != NULL; pdpm = pdpm->next)
4983 if (! pdpm->printed)
4985 if (pdpm->mod->type != DEMANGLE_COMPONENT_RESTRICT
4986 && pdpm->mod->type != DEMANGLE_COMPONENT_VOLATILE
4987 && pdpm->mod->type != DEMANGLE_COMPONENT_CONST)
4988 break;
4989 if (pdpm->mod->type == dc->type)
4991 d_print_comp (dpi, options, d_left (dc));
4992 return;
4997 goto modifier;
4999 case DEMANGLE_COMPONENT_REFERENCE:
5000 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
5002 /* Handle reference smashing: & + && = &. */
5003 struct demangle_component *sub = d_left (dc);
5004 if (!dpi->is_lambda_arg
5005 && sub->type == DEMANGLE_COMPONENT_TEMPLATE_PARAM)
5007 struct d_saved_scope *scope = d_get_saved_scope (dpi, sub);
5008 struct demangle_component *a;
5010 if (scope == NULL)
5012 /* This is the first time SUB has been traversed.
5013 We need to capture the current templates so
5014 they can be restored if SUB is reentered as a
5015 substitution. */
5016 d_save_scope (dpi, sub);
5017 if (d_print_saw_error (dpi))
5018 return;
5020 else
5022 const struct d_component_stack *dcse;
5023 int found_self_or_parent = 0;
5025 /* This traversal is reentering SUB as a substition.
5026 If we are not beneath SUB or DC in the tree then we
5027 need to restore SUB's template stack temporarily. */
5028 for (dcse = dpi->component_stack; dcse != NULL;
5029 dcse = dcse->parent)
5031 if (dcse->dc == sub
5032 || (dcse->dc == dc
5033 && dcse != dpi->component_stack))
5035 found_self_or_parent = 1;
5036 break;
5040 if (!found_self_or_parent)
5042 saved_templates = dpi->templates;
5043 dpi->templates = scope->templates;
5044 need_template_restore = 1;
5048 a = d_lookup_template_argument (dpi, sub);
5049 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
5050 a = d_index_template_argument (a, dpi->pack_index);
5052 if (a == NULL)
5054 if (need_template_restore)
5055 dpi->templates = saved_templates;
5057 d_print_error (dpi);
5058 return;
5061 sub = a;
5064 if (sub->type == DEMANGLE_COMPONENT_REFERENCE
5065 || sub->type == dc->type)
5066 dc = sub;
5067 else if (sub->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE)
5068 mod_inner = d_left (sub);
5070 /* Fall through. */
5072 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
5073 case DEMANGLE_COMPONENT_POINTER:
5074 case DEMANGLE_COMPONENT_COMPLEX:
5075 case DEMANGLE_COMPONENT_IMAGINARY:
5076 FNQUAL_COMPONENT_CASE:
5077 modifier:
5079 /* We keep a list of modifiers on the stack. */
5080 struct d_print_mod dpm;
5082 dpm.next = dpi->modifiers;
5083 dpi->modifiers = &dpm;
5084 dpm.mod = dc;
5085 dpm.printed = 0;
5086 dpm.templates = dpi->templates;
5088 if (!mod_inner)
5089 mod_inner = d_left (dc);
5091 d_print_comp (dpi, options, mod_inner);
5093 /* If the modifier didn't get printed by the type, print it
5094 now. */
5095 if (! dpm.printed)
5096 d_print_mod (dpi, options, dc);
5098 dpi->modifiers = dpm.next;
5100 if (need_template_restore)
5101 dpi->templates = saved_templates;
5103 return;
5106 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
5107 if ((options & DMGL_JAVA) == 0)
5108 d_append_buffer (dpi, dc->u.s_builtin.type->name,
5109 dc->u.s_builtin.type->len);
5110 else
5111 d_append_buffer (dpi, dc->u.s_builtin.type->java_name,
5112 dc->u.s_builtin.type->java_len);
5113 return;
5115 case DEMANGLE_COMPONENT_VENDOR_TYPE:
5116 d_print_comp (dpi, options, d_left (dc));
5117 return;
5119 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
5121 if ((options & DMGL_RET_POSTFIX) != 0)
5122 d_print_function_type (dpi,
5123 options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
5124 dc, dpi->modifiers);
5126 /* Print return type if present */
5127 if (d_left (dc) != NULL && (options & DMGL_RET_POSTFIX) != 0)
5128 d_print_comp (dpi, options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
5129 d_left (dc));
5130 else if (d_left (dc) != NULL && (options & DMGL_RET_DROP) == 0)
5132 struct d_print_mod dpm;
5134 /* We must pass this type down as a modifier in order to
5135 print it in the right location. */
5136 dpm.next = dpi->modifiers;
5137 dpi->modifiers = &dpm;
5138 dpm.mod = dc;
5139 dpm.printed = 0;
5140 dpm.templates = dpi->templates;
5142 d_print_comp (dpi, options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
5143 d_left (dc));
5145 dpi->modifiers = dpm.next;
5147 if (dpm.printed)
5148 return;
5150 /* In standard prefix notation, there is a space between the
5151 return type and the function signature. */
5152 if ((options & DMGL_RET_POSTFIX) == 0)
5153 d_append_char (dpi, ' ');
5156 if ((options & DMGL_RET_POSTFIX) == 0)
5157 d_print_function_type (dpi,
5158 options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
5159 dc, dpi->modifiers);
5161 return;
5164 case DEMANGLE_COMPONENT_ARRAY_TYPE:
5166 struct d_print_mod *hold_modifiers;
5167 struct d_print_mod adpm[4];
5168 unsigned int i;
5169 struct d_print_mod *pdpm;
5171 /* We must pass this type down as a modifier in order to print
5172 multi-dimensional arrays correctly. If the array itself is
5173 CV-qualified, we act as though the element type were
5174 CV-qualified. We do this by copying the modifiers down
5175 rather than fiddling pointers, so that we don't wind up
5176 with a d_print_mod higher on the stack pointing into our
5177 stack frame after we return. */
5179 hold_modifiers = dpi->modifiers;
5181 adpm[0].next = hold_modifiers;
5182 dpi->modifiers = &adpm[0];
5183 adpm[0].mod = dc;
5184 adpm[0].printed = 0;
5185 adpm[0].templates = dpi->templates;
5187 i = 1;
5188 pdpm = hold_modifiers;
5189 while (pdpm != NULL
5190 && (pdpm->mod->type == DEMANGLE_COMPONENT_RESTRICT
5191 || pdpm->mod->type == DEMANGLE_COMPONENT_VOLATILE
5192 || pdpm->mod->type == DEMANGLE_COMPONENT_CONST))
5194 if (! pdpm->printed)
5196 if (i >= sizeof adpm / sizeof adpm[0])
5198 d_print_error (dpi);
5199 return;
5202 adpm[i] = *pdpm;
5203 adpm[i].next = dpi->modifiers;
5204 dpi->modifiers = &adpm[i];
5205 pdpm->printed = 1;
5206 ++i;
5209 pdpm = pdpm->next;
5212 d_print_comp (dpi, options, d_right (dc));
5214 dpi->modifiers = hold_modifiers;
5216 if (adpm[0].printed)
5217 return;
5219 while (i > 1)
5221 --i;
5222 d_print_mod (dpi, options, adpm[i].mod);
5225 d_print_array_type (dpi, options, dc, dpi->modifiers);
5227 return;
5230 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
5231 case DEMANGLE_COMPONENT_VECTOR_TYPE:
5233 struct d_print_mod dpm;
5235 dpm.next = dpi->modifiers;
5236 dpi->modifiers = &dpm;
5237 dpm.mod = dc;
5238 dpm.printed = 0;
5239 dpm.templates = dpi->templates;
5241 d_print_comp (dpi, options, d_right (dc));
5243 /* If the modifier didn't get printed by the type, print it
5244 now. */
5245 if (! dpm.printed)
5246 d_print_mod (dpi, options, dc);
5248 dpi->modifiers = dpm.next;
5250 return;
5253 case DEMANGLE_COMPONENT_FIXED_TYPE:
5254 if (dc->u.s_fixed.sat)
5255 d_append_string (dpi, "_Sat ");
5256 /* Don't print "int _Accum". */
5257 if (dc->u.s_fixed.length->u.s_builtin.type
5258 != &cplus_demangle_builtin_types['i'-'a'])
5260 d_print_comp (dpi, options, dc->u.s_fixed.length);
5261 d_append_char (dpi, ' ');
5263 if (dc->u.s_fixed.accum)
5264 d_append_string (dpi, "_Accum");
5265 else
5266 d_append_string (dpi, "_Fract");
5267 return;
5269 case DEMANGLE_COMPONENT_ARGLIST:
5270 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
5271 if (d_left (dc) != NULL)
5272 d_print_comp (dpi, options, d_left (dc));
5273 if (d_right (dc) != NULL)
5275 size_t len;
5276 unsigned long int flush_count;
5277 /* Make sure ", " isn't flushed by d_append_string, otherwise
5278 dpi->len -= 2 wouldn't work. */
5279 if (dpi->len >= sizeof (dpi->buf) - 2)
5280 d_print_flush (dpi);
5281 d_append_string (dpi, ", ");
5282 len = dpi->len;
5283 flush_count = dpi->flush_count;
5284 d_print_comp (dpi, options, d_right (dc));
5285 /* If that didn't print anything (which can happen with empty
5286 template argument packs), remove the comma and space. */
5287 if (dpi->flush_count == flush_count && dpi->len == len)
5288 dpi->len -= 2;
5290 return;
5292 case DEMANGLE_COMPONENT_INITIALIZER_LIST:
5294 struct demangle_component *type = d_left (dc);
5295 struct demangle_component *list = d_right (dc);
5297 if (type)
5298 d_print_comp (dpi, options, type);
5299 d_append_char (dpi, '{');
5300 d_print_comp (dpi, options, list);
5301 d_append_char (dpi, '}');
5303 return;
5305 case DEMANGLE_COMPONENT_OPERATOR:
5307 const struct demangle_operator_info *op = dc->u.s_operator.op;
5308 int len = op->len;
5310 d_append_string (dpi, "operator");
5311 /* Add a space before new/delete. */
5312 if (IS_LOWER (op->name[0]))
5313 d_append_char (dpi, ' ');
5314 /* Omit a trailing space. */
5315 if (op->name[len-1] == ' ')
5316 --len;
5317 d_append_buffer (dpi, op->name, len);
5318 return;
5321 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
5322 d_append_string (dpi, "operator ");
5323 d_print_comp (dpi, options, dc->u.s_extended_operator.name);
5324 return;
5326 case DEMANGLE_COMPONENT_CONVERSION:
5327 d_append_string (dpi, "operator ");
5328 d_print_conversion (dpi, options, dc);
5329 return;
5331 case DEMANGLE_COMPONENT_NULLARY:
5332 d_print_expr_op (dpi, options, d_left (dc));
5333 return;
5335 case DEMANGLE_COMPONENT_UNARY:
5337 struct demangle_component *op = d_left (dc);
5338 struct demangle_component *operand = d_right (dc);
5339 const char *code = NULL;
5341 if (op->type == DEMANGLE_COMPONENT_OPERATOR)
5343 code = op->u.s_operator.op->code;
5344 if (!strcmp (code, "ad"))
5346 /* Don't print the argument list for the address of a
5347 function. */
5348 if (operand->type == DEMANGLE_COMPONENT_TYPED_NAME
5349 && d_left (operand)->type == DEMANGLE_COMPONENT_QUAL_NAME
5350 && d_right (operand)->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
5351 operand = d_left (operand);
5353 if (operand->type == DEMANGLE_COMPONENT_BINARY_ARGS)
5355 /* This indicates a suffix operator. */
5356 operand = d_left (operand);
5357 d_print_subexpr (dpi, options, operand);
5358 d_print_expr_op (dpi, options, op);
5359 return;
5363 /* For sizeof..., just print the pack length. */
5364 if (code && !strcmp (code, "sZ"))
5366 struct demangle_component *a = d_find_pack (dpi, operand);
5367 int len = d_pack_length (a);
5368 d_append_num (dpi, len);
5369 return;
5371 else if (code && !strcmp (code, "sP"))
5373 int len = d_args_length (dpi, operand);
5374 d_append_num (dpi, len);
5375 return;
5378 if (op->type != DEMANGLE_COMPONENT_CAST)
5379 d_print_expr_op (dpi, options, op);
5380 else
5382 d_append_char (dpi, '(');
5383 d_print_cast (dpi, options, op);
5384 d_append_char (dpi, ')');
5386 if (code && !strcmp (code, "gs"))
5387 /* Avoid parens after '::'. */
5388 d_print_comp (dpi, options, operand);
5389 else if (code && !strcmp (code, "st"))
5390 /* Always print parens for sizeof (type). */
5392 d_append_char (dpi, '(');
5393 d_print_comp (dpi, options, operand);
5394 d_append_char (dpi, ')');
5396 else
5397 d_print_subexpr (dpi, options, operand);
5399 return;
5401 case DEMANGLE_COMPONENT_BINARY:
5402 if (d_right (dc)->type != DEMANGLE_COMPONENT_BINARY_ARGS)
5404 d_print_error (dpi);
5405 return;
5408 if (op_is_new_cast (d_left (dc)))
5410 d_print_expr_op (dpi, options, d_left (dc));
5411 d_append_char (dpi, '<');
5412 d_print_comp (dpi, options, d_left (d_right (dc)));
5413 d_append_string (dpi, ">(");
5414 d_print_comp (dpi, options, d_right (d_right (dc)));
5415 d_append_char (dpi, ')');
5416 return;
5419 if (d_maybe_print_fold_expression (dpi, options, dc))
5420 return;
5422 /* We wrap an expression which uses the greater-than operator in
5423 an extra layer of parens so that it does not get confused
5424 with the '>' which ends the template parameters. */
5425 if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
5426 && d_left (dc)->u.s_operator.op->len == 1
5427 && d_left (dc)->u.s_operator.op->name[0] == '>')
5428 d_append_char (dpi, '(');
5430 if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") == 0
5431 && d_left (d_right (dc))->type == DEMANGLE_COMPONENT_TYPED_NAME)
5433 /* Function call used in an expression should not have printed types
5434 of the function arguments. Values of the function arguments still
5435 get printed below. */
5437 const struct demangle_component *func = d_left (d_right (dc));
5439 if (d_right (func)->type != DEMANGLE_COMPONENT_FUNCTION_TYPE)
5440 d_print_error (dpi);
5441 d_print_subexpr (dpi, options, d_left (func));
5443 else
5444 d_print_subexpr (dpi, options, d_left (d_right (dc)));
5445 if (strcmp (d_left (dc)->u.s_operator.op->code, "ix") == 0)
5447 d_append_char (dpi, '[');
5448 d_print_comp (dpi, options, d_right (d_right (dc)));
5449 d_append_char (dpi, ']');
5451 else
5453 if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") != 0)
5454 d_print_expr_op (dpi, options, d_left (dc));
5455 d_print_subexpr (dpi, options, d_right (d_right (dc)));
5458 if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
5459 && d_left (dc)->u.s_operator.op->len == 1
5460 && d_left (dc)->u.s_operator.op->name[0] == '>')
5461 d_append_char (dpi, ')');
5463 return;
5465 case DEMANGLE_COMPONENT_BINARY_ARGS:
5466 /* We should only see this as part of DEMANGLE_COMPONENT_BINARY. */
5467 d_print_error (dpi);
5468 return;
5470 case DEMANGLE_COMPONENT_TRINARY:
5471 if (d_right (dc)->type != DEMANGLE_COMPONENT_TRINARY_ARG1
5472 || d_right (d_right (dc))->type != DEMANGLE_COMPONENT_TRINARY_ARG2)
5474 d_print_error (dpi);
5475 return;
5477 if (d_maybe_print_fold_expression (dpi, options, dc))
5478 return;
5480 struct demangle_component *op = d_left (dc);
5481 struct demangle_component *first = d_left (d_right (dc));
5482 struct demangle_component *second = d_left (d_right (d_right (dc)));
5483 struct demangle_component *third = d_right (d_right (d_right (dc)));
5485 if (!strcmp (op->u.s_operator.op->code, "qu"))
5487 d_print_subexpr (dpi, options, first);
5488 d_print_expr_op (dpi, options, op);
5489 d_print_subexpr (dpi, options, second);
5490 d_append_string (dpi, " : ");
5491 d_print_subexpr (dpi, options, third);
5493 else
5495 d_append_string (dpi, "new ");
5496 if (d_left (first) != NULL)
5498 d_print_subexpr (dpi, options, first);
5499 d_append_char (dpi, ' ');
5501 d_print_comp (dpi, options, second);
5502 if (third)
5503 d_print_subexpr (dpi, options, third);
5506 return;
5508 case DEMANGLE_COMPONENT_TRINARY_ARG1:
5509 case DEMANGLE_COMPONENT_TRINARY_ARG2:
5510 /* We should only see these are part of DEMANGLE_COMPONENT_TRINARY. */
5511 d_print_error (dpi);
5512 return;
5514 case DEMANGLE_COMPONENT_LITERAL:
5515 case DEMANGLE_COMPONENT_LITERAL_NEG:
5517 enum d_builtin_type_print tp;
5519 /* For some builtin types, produce simpler output. */
5520 tp = D_PRINT_DEFAULT;
5521 if (d_left (dc)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE)
5523 tp = d_left (dc)->u.s_builtin.type->print;
5524 switch (tp)
5526 case D_PRINT_INT:
5527 case D_PRINT_UNSIGNED:
5528 case D_PRINT_LONG:
5529 case D_PRINT_UNSIGNED_LONG:
5530 case D_PRINT_LONG_LONG:
5531 case D_PRINT_UNSIGNED_LONG_LONG:
5532 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME)
5534 if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
5535 d_append_char (dpi, '-');
5536 d_print_comp (dpi, options, d_right (dc));
5537 switch (tp)
5539 default:
5540 break;
5541 case D_PRINT_UNSIGNED:
5542 d_append_char (dpi, 'u');
5543 break;
5544 case D_PRINT_LONG:
5545 d_append_char (dpi, 'l');
5546 break;
5547 case D_PRINT_UNSIGNED_LONG:
5548 d_append_string (dpi, "ul");
5549 break;
5550 case D_PRINT_LONG_LONG:
5551 d_append_string (dpi, "ll");
5552 break;
5553 case D_PRINT_UNSIGNED_LONG_LONG:
5554 d_append_string (dpi, "ull");
5555 break;
5557 return;
5559 break;
5561 case D_PRINT_BOOL:
5562 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME
5563 && d_right (dc)->u.s_name.len == 1
5564 && dc->type == DEMANGLE_COMPONENT_LITERAL)
5566 switch (d_right (dc)->u.s_name.s[0])
5568 case '0':
5569 d_append_string (dpi, "false");
5570 return;
5571 case '1':
5572 d_append_string (dpi, "true");
5573 return;
5574 default:
5575 break;
5578 break;
5580 default:
5581 break;
5585 d_append_char (dpi, '(');
5586 d_print_comp (dpi, options, d_left (dc));
5587 d_append_char (dpi, ')');
5588 if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
5589 d_append_char (dpi, '-');
5590 if (tp == D_PRINT_FLOAT)
5591 d_append_char (dpi, '[');
5592 d_print_comp (dpi, options, d_right (dc));
5593 if (tp == D_PRINT_FLOAT)
5594 d_append_char (dpi, ']');
5596 return;
5598 case DEMANGLE_COMPONENT_NUMBER:
5599 d_append_num (dpi, dc->u.s_number.number);
5600 return;
5602 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
5603 d_append_string (dpi, "java resource ");
5604 d_print_comp (dpi, options, d_left (dc));
5605 return;
5607 case DEMANGLE_COMPONENT_COMPOUND_NAME:
5608 d_print_comp (dpi, options, d_left (dc));
5609 d_print_comp (dpi, options, d_right (dc));
5610 return;
5612 case DEMANGLE_COMPONENT_CHARACTER:
5613 d_append_char (dpi, dc->u.s_character.character);
5614 return;
5616 case DEMANGLE_COMPONENT_DECLTYPE:
5617 d_append_string (dpi, "decltype (");
5618 d_print_comp (dpi, options, d_left (dc));
5619 d_append_char (dpi, ')');
5620 return;
5622 case DEMANGLE_COMPONENT_PACK_EXPANSION:
5624 int len;
5625 int i;
5626 struct demangle_component *a = d_find_pack (dpi, d_left (dc));
5627 if (a == NULL)
5629 /* d_find_pack won't find anything if the only packs involved
5630 in this expansion are function parameter packs; in that
5631 case, just print the pattern and "...". */
5632 d_print_subexpr (dpi, options, d_left (dc));
5633 d_append_string (dpi, "...");
5634 return;
5637 len = d_pack_length (a);
5638 dc = d_left (dc);
5639 for (i = 0; i < len; ++i)
5641 dpi->pack_index = i;
5642 d_print_comp (dpi, options, dc);
5643 if (i < len-1)
5644 d_append_string (dpi, ", ");
5647 return;
5649 case DEMANGLE_COMPONENT_FUNCTION_PARAM:
5651 long num = dc->u.s_number.number;
5652 if (num == 0)
5653 d_append_string (dpi, "this");
5654 else
5656 d_append_string (dpi, "{parm#");
5657 d_append_num (dpi, num);
5658 d_append_char (dpi, '}');
5661 return;
5663 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
5664 d_append_string (dpi, "global constructors keyed to ");
5665 d_print_comp (dpi, options, dc->u.s_binary.left);
5666 return;
5668 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
5669 d_append_string (dpi, "global destructors keyed to ");
5670 d_print_comp (dpi, options, dc->u.s_binary.left);
5671 return;
5673 case DEMANGLE_COMPONENT_LAMBDA:
5674 d_append_string (dpi, "{lambda(");
5675 /* Generic lambda auto parms are mangled as the template type
5676 parm they are. */
5677 dpi->is_lambda_arg++;
5678 d_print_comp (dpi, options, dc->u.s_unary_num.sub);
5679 dpi->is_lambda_arg--;
5680 d_append_string (dpi, ")#");
5681 d_append_num (dpi, dc->u.s_unary_num.num + 1);
5682 d_append_char (dpi, '}');
5683 return;
5685 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
5686 d_append_string (dpi, "{unnamed type#");
5687 d_append_num (dpi, dc->u.s_number.number + 1);
5688 d_append_char (dpi, '}');
5689 return;
5691 case DEMANGLE_COMPONENT_CLONE:
5692 d_print_comp (dpi, options, d_left (dc));
5693 d_append_string (dpi, " [clone ");
5694 d_print_comp (dpi, options, d_right (dc));
5695 d_append_char (dpi, ']');
5696 return;
5698 default:
5699 d_print_error (dpi);
5700 return;
5704 static void
5705 d_print_comp (struct d_print_info *dpi, int options,
5706 struct demangle_component *dc)
5708 struct d_component_stack self;
5709 if (dc == NULL || dc->d_printing > 1 || dpi->recursion > MAX_RECURSION_COUNT)
5711 d_print_error (dpi);
5712 return;
5715 dc->d_printing++;
5716 dpi->recursion++;
5718 self.dc = dc;
5719 self.parent = dpi->component_stack;
5720 dpi->component_stack = &self;
5722 d_print_comp_inner (dpi, options, dc);
5724 dpi->component_stack = self.parent;
5725 dc->d_printing--;
5726 dpi->recursion--;
5729 /* Print a Java dentifier. For Java we try to handle encoded extended
5730 Unicode characters. The C++ ABI doesn't mention Unicode encoding,
5731 so we don't it for C++. Characters are encoded as
5732 __U<hex-char>+_. */
5734 static void
5735 d_print_java_identifier (struct d_print_info *dpi, const char *name, int len)
5737 const char *p;
5738 const char *end;
5740 end = name + len;
5741 for (p = name; p < end; ++p)
5743 if (end - p > 3
5744 && p[0] == '_'
5745 && p[1] == '_'
5746 && p[2] == 'U')
5748 unsigned long c;
5749 const char *q;
5751 c = 0;
5752 for (q = p + 3; q < end; ++q)
5754 int dig;
5756 if (IS_DIGIT (*q))
5757 dig = *q - '0';
5758 else if (*q >= 'A' && *q <= 'F')
5759 dig = *q - 'A' + 10;
5760 else if (*q >= 'a' && *q <= 'f')
5761 dig = *q - 'a' + 10;
5762 else
5763 break;
5765 c = c * 16 + dig;
5767 /* If the Unicode character is larger than 256, we don't try
5768 to deal with it here. FIXME. */
5769 if (q < end && *q == '_' && c < 256)
5771 d_append_char (dpi, c);
5772 p = q;
5773 continue;
5777 d_append_char (dpi, *p);
5781 /* Print a list of modifiers. SUFFIX is 1 if we are printing
5782 qualifiers on this after printing a function. */
5784 static void
5785 d_print_mod_list (struct d_print_info *dpi, int options,
5786 struct d_print_mod *mods, int suffix)
5788 struct d_print_template *hold_dpt;
5790 if (mods == NULL || d_print_saw_error (dpi))
5791 return;
5793 if (mods->printed
5794 || (! suffix
5795 && (is_fnqual_component_type (mods->mod->type))))
5797 d_print_mod_list (dpi, options, mods->next, suffix);
5798 return;
5801 mods->printed = 1;
5803 hold_dpt = dpi->templates;
5804 dpi->templates = mods->templates;
5806 if (mods->mod->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
5808 d_print_function_type (dpi, options, mods->mod, mods->next);
5809 dpi->templates = hold_dpt;
5810 return;
5812 else if (mods->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
5814 d_print_array_type (dpi, options, mods->mod, mods->next);
5815 dpi->templates = hold_dpt;
5816 return;
5818 else if (mods->mod->type == DEMANGLE_COMPONENT_LOCAL_NAME)
5820 struct d_print_mod *hold_modifiers;
5821 struct demangle_component *dc;
5823 /* When this is on the modifier stack, we have pulled any
5824 qualifiers off the right argument already. Otherwise, we
5825 print it as usual, but don't let the left argument see any
5826 modifiers. */
5828 hold_modifiers = dpi->modifiers;
5829 dpi->modifiers = NULL;
5830 d_print_comp (dpi, options, d_left (mods->mod));
5831 dpi->modifiers = hold_modifiers;
5833 if ((options & DMGL_JAVA) == 0)
5834 d_append_string (dpi, "::");
5835 else
5836 d_append_char (dpi, '.');
5838 dc = d_right (mods->mod);
5840 if (dc->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
5842 d_append_string (dpi, "{default arg#");
5843 d_append_num (dpi, dc->u.s_unary_num.num + 1);
5844 d_append_string (dpi, "}::");
5845 dc = dc->u.s_unary_num.sub;
5848 while (is_fnqual_component_type (dc->type))
5849 dc = d_left (dc);
5851 d_print_comp (dpi, options, dc);
5853 dpi->templates = hold_dpt;
5854 return;
5857 d_print_mod (dpi, options, mods->mod);
5859 dpi->templates = hold_dpt;
5861 d_print_mod_list (dpi, options, mods->next, suffix);
5864 /* Print a modifier. */
5866 static void
5867 d_print_mod (struct d_print_info *dpi, int options,
5868 struct demangle_component *mod)
5870 switch (mod->type)
5872 case DEMANGLE_COMPONENT_RESTRICT:
5873 case DEMANGLE_COMPONENT_RESTRICT_THIS:
5874 d_append_string (dpi, " restrict");
5875 return;
5876 case DEMANGLE_COMPONENT_VOLATILE:
5877 case DEMANGLE_COMPONENT_VOLATILE_THIS:
5878 d_append_string (dpi, " volatile");
5879 return;
5880 case DEMANGLE_COMPONENT_CONST:
5881 case DEMANGLE_COMPONENT_CONST_THIS:
5882 d_append_string (dpi, " const");
5883 return;
5884 case DEMANGLE_COMPONENT_TRANSACTION_SAFE:
5885 d_append_string (dpi, " transaction_safe");
5886 return;
5887 case DEMANGLE_COMPONENT_NOEXCEPT:
5888 d_append_string (dpi, " noexcept");
5889 if (d_right (mod))
5891 d_append_char (dpi, '(');
5892 d_print_comp (dpi, options, d_right (mod));
5893 d_append_char (dpi, ')');
5895 return;
5896 case DEMANGLE_COMPONENT_THROW_SPEC:
5897 d_append_string (dpi, " throw");
5898 if (d_right (mod))
5900 d_append_char (dpi, '(');
5901 d_print_comp (dpi, options, d_right (mod));
5902 d_append_char (dpi, ')');
5904 return;
5905 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
5906 d_append_char (dpi, ' ');
5907 d_print_comp (dpi, options, d_right (mod));
5908 return;
5909 case DEMANGLE_COMPONENT_POINTER:
5910 /* There is no pointer symbol in Java. */
5911 if ((options & DMGL_JAVA) == 0)
5912 d_append_char (dpi, '*');
5913 return;
5914 case DEMANGLE_COMPONENT_REFERENCE_THIS:
5915 /* For the ref-qualifier, put a space before the &. */
5916 d_append_char (dpi, ' ');
5917 /* FALLTHRU */
5918 case DEMANGLE_COMPONENT_REFERENCE:
5919 d_append_char (dpi, '&');
5920 return;
5921 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
5922 d_append_char (dpi, ' ');
5923 /* FALLTHRU */
5924 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
5925 d_append_string (dpi, "&&");
5926 return;
5927 case DEMANGLE_COMPONENT_COMPLEX:
5928 d_append_string (dpi, "complex ");
5929 return;
5930 case DEMANGLE_COMPONENT_IMAGINARY:
5931 d_append_string (dpi, "imaginary ");
5932 return;
5933 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
5934 if (d_last_char (dpi) != '(')
5935 d_append_char (dpi, ' ');
5936 d_print_comp (dpi, options, d_left (mod));
5937 d_append_string (dpi, "::*");
5938 return;
5939 case DEMANGLE_COMPONENT_TYPED_NAME:
5940 d_print_comp (dpi, options, d_left (mod));
5941 return;
5942 case DEMANGLE_COMPONENT_VECTOR_TYPE:
5943 d_append_string (dpi, " __vector(");
5944 d_print_comp (dpi, options, d_left (mod));
5945 d_append_char (dpi, ')');
5946 return;
5948 default:
5949 /* Otherwise, we have something that won't go back on the
5950 modifier stack, so we can just print it. */
5951 d_print_comp (dpi, options, mod);
5952 return;
5956 /* Print a function type, except for the return type. */
5958 static void
5959 d_print_function_type (struct d_print_info *dpi, int options,
5960 struct demangle_component *dc,
5961 struct d_print_mod *mods)
5963 int need_paren;
5964 int need_space;
5965 struct d_print_mod *p;
5966 struct d_print_mod *hold_modifiers;
5968 need_paren = 0;
5969 need_space = 0;
5970 for (p = mods; p != NULL; p = p->next)
5972 if (p->printed)
5973 break;
5975 switch (p->mod->type)
5977 case DEMANGLE_COMPONENT_POINTER:
5978 case DEMANGLE_COMPONENT_REFERENCE:
5979 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
5980 need_paren = 1;
5981 break;
5982 case DEMANGLE_COMPONENT_RESTRICT:
5983 case DEMANGLE_COMPONENT_VOLATILE:
5984 case DEMANGLE_COMPONENT_CONST:
5985 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
5986 case DEMANGLE_COMPONENT_COMPLEX:
5987 case DEMANGLE_COMPONENT_IMAGINARY:
5988 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
5989 need_space = 1;
5990 need_paren = 1;
5991 break;
5992 FNQUAL_COMPONENT_CASE:
5993 break;
5994 default:
5995 break;
5997 if (need_paren)
5998 break;
6001 if (need_paren)
6003 if (! need_space)
6005 if (d_last_char (dpi) != '('
6006 && d_last_char (dpi) != '*')
6007 need_space = 1;
6009 if (need_space && d_last_char (dpi) != ' ')
6010 d_append_char (dpi, ' ');
6011 d_append_char (dpi, '(');
6014 hold_modifiers = dpi->modifiers;
6015 dpi->modifiers = NULL;
6017 d_print_mod_list (dpi, options, mods, 0);
6019 if (need_paren)
6020 d_append_char (dpi, ')');
6022 d_append_char (dpi, '(');
6024 if (d_right (dc) != NULL)
6025 d_print_comp (dpi, options, d_right (dc));
6027 d_append_char (dpi, ')');
6029 d_print_mod_list (dpi, options, mods, 1);
6031 dpi->modifiers = hold_modifiers;
6034 /* Print an array type, except for the element type. */
6036 static void
6037 d_print_array_type (struct d_print_info *dpi, int options,
6038 struct demangle_component *dc,
6039 struct d_print_mod *mods)
6041 int need_space;
6043 need_space = 1;
6044 if (mods != NULL)
6046 int need_paren;
6047 struct d_print_mod *p;
6049 need_paren = 0;
6050 for (p = mods; p != NULL; p = p->next)
6052 if (! p->printed)
6054 if (p->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
6056 need_space = 0;
6057 break;
6059 else
6061 need_paren = 1;
6062 need_space = 1;
6063 break;
6068 if (need_paren)
6069 d_append_string (dpi, " (");
6071 d_print_mod_list (dpi, options, mods, 0);
6073 if (need_paren)
6074 d_append_char (dpi, ')');
6077 if (need_space)
6078 d_append_char (dpi, ' ');
6080 d_append_char (dpi, '[');
6082 if (d_left (dc) != NULL)
6083 d_print_comp (dpi, options, d_left (dc));
6085 d_append_char (dpi, ']');
6088 /* Print an operator in an expression. */
6090 static void
6091 d_print_expr_op (struct d_print_info *dpi, int options,
6092 struct demangle_component *dc)
6094 if (dc->type == DEMANGLE_COMPONENT_OPERATOR)
6095 d_append_buffer (dpi, dc->u.s_operator.op->name,
6096 dc->u.s_operator.op->len);
6097 else
6098 d_print_comp (dpi, options, dc);
6101 /* Print a cast. */
6103 static void
6104 d_print_cast (struct d_print_info *dpi, int options,
6105 struct demangle_component *dc)
6107 d_print_comp (dpi, options, d_left (dc));
6110 /* Print a conversion operator. */
6112 static void
6113 d_print_conversion (struct d_print_info *dpi, int options,
6114 struct demangle_component *dc)
6116 struct d_print_template dpt;
6118 /* For a conversion operator, we need the template parameters from
6119 the enclosing template in scope for processing the type. */
6120 if (dpi->current_template != NULL)
6122 dpt.next = dpi->templates;
6123 dpi->templates = &dpt;
6124 dpt.template_decl = dpi->current_template;
6127 if (d_left (dc)->type != DEMANGLE_COMPONENT_TEMPLATE)
6129 d_print_comp (dpi, options, d_left (dc));
6130 if (dpi->current_template != NULL)
6131 dpi->templates = dpt.next;
6133 else
6135 d_print_comp (dpi, options, d_left (d_left (dc)));
6137 /* For a templated cast operator, we need to remove the template
6138 parameters from scope after printing the operator name,
6139 so we need to handle the template printing here. */
6140 if (dpi->current_template != NULL)
6141 dpi->templates = dpt.next;
6143 if (d_last_char (dpi) == '<')
6144 d_append_char (dpi, ' ');
6145 d_append_char (dpi, '<');
6146 d_print_comp (dpi, options, d_right (d_left (dc)));
6147 /* Avoid generating two consecutive '>' characters, to avoid
6148 the C++ syntactic ambiguity. */
6149 if (d_last_char (dpi) == '>')
6150 d_append_char (dpi, ' ');
6151 d_append_char (dpi, '>');
6155 /* Initialize the information structure we use to pass around
6156 information. */
6158 CP_STATIC_IF_GLIBCPP_V3
6159 void
6160 cplus_demangle_init_info (const char *mangled, int options, size_t len,
6161 struct d_info *di)
6163 di->s = mangled;
6164 di->send = mangled + len;
6165 di->options = options;
6167 di->n = mangled;
6169 /* We can not need more components than twice the number of chars in
6170 the mangled string. Most components correspond directly to
6171 chars, but the ARGLIST types are exceptions. */
6172 di->num_comps = 2 * len;
6173 di->next_comp = 0;
6175 /* Similarly, we can not need more substitutions than there are
6176 chars in the mangled string. */
6177 di->num_subs = len;
6178 di->next_sub = 0;
6180 di->last_name = NULL;
6182 di->expansion = 0;
6183 di->is_expression = 0;
6184 di->is_conversion = 0;
6187 /* Internal implementation for the demangler. If MANGLED is a g++ v3 ABI
6188 mangled name, return strings in repeated callback giving the demangled
6189 name. OPTIONS is the usual libiberty demangler options. On success,
6190 this returns 1. On failure, returns 0. */
6192 static int
6193 d_demangle_callback (const char *mangled, int options,
6194 demangle_callbackref callback, void *opaque)
6196 enum
6198 DCT_TYPE,
6199 DCT_MANGLED,
6200 DCT_GLOBAL_CTORS,
6201 DCT_GLOBAL_DTORS
6203 type;
6204 struct d_info di;
6205 struct demangle_component *dc;
6206 int status;
6208 if (mangled[0] == '_' && mangled[1] == 'Z')
6209 type = DCT_MANGLED;
6210 else if (strncmp (mangled, "_GLOBAL_", 8) == 0
6211 && (mangled[8] == '.' || mangled[8] == '_' || mangled[8] == '$')
6212 && (mangled[9] == 'D' || mangled[9] == 'I')
6213 && mangled[10] == '_')
6214 type = mangled[9] == 'I' ? DCT_GLOBAL_CTORS : DCT_GLOBAL_DTORS;
6215 else
6217 if ((options & DMGL_TYPES) == 0)
6218 return 0;
6219 type = DCT_TYPE;
6222 cplus_demangle_init_info (mangled, options, strlen (mangled), &di);
6225 #ifdef CP_DYNAMIC_ARRAYS
6226 __extension__ struct demangle_component comps[di.num_comps];
6227 __extension__ struct demangle_component *subs[di.num_subs];
6229 di.comps = comps;
6230 di.subs = subs;
6231 #else
6232 di.comps = alloca (di.num_comps * sizeof (*di.comps));
6233 di.subs = alloca (di.num_subs * sizeof (*di.subs));
6234 #endif
6236 switch (type)
6238 case DCT_TYPE:
6239 dc = cplus_demangle_type (&di);
6240 break;
6241 case DCT_MANGLED:
6242 dc = cplus_demangle_mangled_name (&di, 1);
6243 break;
6244 case DCT_GLOBAL_CTORS:
6245 case DCT_GLOBAL_DTORS:
6246 d_advance (&di, 11);
6247 dc = d_make_comp (&di,
6248 (type == DCT_GLOBAL_CTORS
6249 ? DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
6250 : DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS),
6251 d_make_demangle_mangled_name (&di, d_str (&di)),
6252 NULL);
6253 d_advance (&di, strlen (d_str (&di)));
6254 break;
6255 default:
6256 abort (); /* We have listed all the cases. */
6259 /* If DMGL_PARAMS is set, then if we didn't consume the entire
6260 mangled string, then we didn't successfully demangle it. If
6261 DMGL_PARAMS is not set, we didn't look at the trailing
6262 parameters. */
6263 if (((options & DMGL_PARAMS) != 0) && d_peek_char (&di) != '\0')
6264 dc = NULL;
6266 #ifdef CP_DEMANGLE_DEBUG
6267 d_dump (dc, 0);
6268 #endif
6270 status = (dc != NULL)
6271 ? cplus_demangle_print_callback (options, dc, callback, opaque)
6272 : 0;
6275 return status;
6278 /* Entry point for the demangler. If MANGLED is a g++ v3 ABI mangled
6279 name, return a buffer allocated with malloc holding the demangled
6280 name. OPTIONS is the usual libiberty demangler options. On
6281 success, this sets *PALC to the allocated size of the returned
6282 buffer. On failure, this sets *PALC to 0 for a bad name, or 1 for
6283 a memory allocation failure, and returns NULL. */
6285 static char *
6286 d_demangle (const char *mangled, int options, size_t *palc)
6288 struct d_growable_string dgs;
6289 int status;
6291 d_growable_string_init (&dgs, 0);
6293 status = d_demangle_callback (mangled, options,
6294 d_growable_string_callback_adapter, &dgs);
6295 if (status == 0)
6297 free (dgs.buf);
6298 *palc = 0;
6299 return NULL;
6302 *palc = dgs.allocation_failure ? 1 : dgs.alc;
6303 return dgs.buf;
6306 #if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3)
6308 extern char *__cxa_demangle (const char *, char *, size_t *, int *);
6310 /* ia64 ABI-mandated entry point in the C++ runtime library for
6311 performing demangling. MANGLED_NAME is a NUL-terminated character
6312 string containing the name to be demangled.
6314 OUTPUT_BUFFER is a region of memory, allocated with malloc, of
6315 *LENGTH bytes, into which the demangled name is stored. If
6316 OUTPUT_BUFFER is not long enough, it is expanded using realloc.
6317 OUTPUT_BUFFER may instead be NULL; in that case, the demangled name
6318 is placed in a region of memory allocated with malloc.
6320 If LENGTH is non-NULL, the length of the buffer containing the
6321 demangled name, is placed in *LENGTH.
6323 The return value is a pointer to the start of the NUL-terminated
6324 demangled name, or NULL if the demangling fails. The caller is
6325 responsible for deallocating this memory using free.
6327 *STATUS is set to one of the following values:
6328 0: The demangling operation succeeded.
6329 -1: A memory allocation failure occurred.
6330 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
6331 -3: One of the arguments is invalid.
6333 The demangling is performed using the C++ ABI mangling rules, with
6334 GNU extensions. */
6336 char *
6337 __cxa_demangle (const char *mangled_name, char *output_buffer,
6338 size_t *length, int *status)
6340 char *demangled;
6341 size_t alc;
6343 if (mangled_name == NULL)
6345 if (status != NULL)
6346 *status = -3;
6347 return NULL;
6350 if (output_buffer != NULL && length == NULL)
6352 if (status != NULL)
6353 *status = -3;
6354 return NULL;
6357 demangled = d_demangle (mangled_name, DMGL_PARAMS | DMGL_TYPES, &alc);
6359 if (demangled == NULL)
6361 if (status != NULL)
6363 if (alc == 1)
6364 *status = -1;
6365 else
6366 *status = -2;
6368 return NULL;
6371 if (output_buffer == NULL)
6373 if (length != NULL)
6374 *length = alc;
6376 else
6378 if (strlen (demangled) < *length)
6380 strcpy (output_buffer, demangled);
6381 free (demangled);
6382 demangled = output_buffer;
6384 else
6386 free (output_buffer);
6387 *length = alc;
6391 if (status != NULL)
6392 *status = 0;
6394 return demangled;
6397 extern int __gcclibcxx_demangle_callback (const char *,
6398 void (*)
6399 (const char *, size_t, void *),
6400 void *);
6402 /* Alternative, allocationless entry point in the C++ runtime library
6403 for performing demangling. MANGLED_NAME is a NUL-terminated character
6404 string containing the name to be demangled.
6406 CALLBACK is a callback function, called with demangled string
6407 segments as demangling progresses; it is called at least once,
6408 but may be called more than once. OPAQUE is a generalized pointer
6409 used as a callback argument.
6411 The return code is one of the following values, equivalent to
6412 the STATUS values of __cxa_demangle() (excluding -1, since this
6413 function performs no memory allocations):
6414 0: The demangling operation succeeded.
6415 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
6416 -3: One of the arguments is invalid.
6418 The demangling is performed using the C++ ABI mangling rules, with
6419 GNU extensions. */
6422 __gcclibcxx_demangle_callback (const char *mangled_name,
6423 void (*callback) (const char *, size_t, void *),
6424 void *opaque)
6426 int status;
6428 if (mangled_name == NULL || callback == NULL)
6429 return -3;
6431 status = d_demangle_callback (mangled_name, DMGL_PARAMS | DMGL_TYPES,
6432 callback, opaque);
6433 if (status == 0)
6434 return -2;
6436 return 0;
6439 #else /* ! (IN_LIBGCC2 || IN_GLIBCPP_V3) */
6441 /* Entry point for libiberty demangler. If MANGLED is a g++ v3 ABI
6442 mangled name, return a buffer allocated with malloc holding the
6443 demangled name. Otherwise, return NULL. */
6445 char *
6446 cplus_demangle_v3 (const char *mangled, int options)
6448 size_t alc;
6450 return d_demangle (mangled, options, &alc);
6454 cplus_demangle_v3_callback (const char *mangled, int options,
6455 demangle_callbackref callback, void *opaque)
6457 return d_demangle_callback (mangled, options, callback, opaque);
6460 /* Demangle a Java symbol. Java uses a subset of the V3 ABI C++ mangling
6461 conventions, but the output formatting is a little different.
6462 This instructs the C++ demangler not to emit pointer characters ("*"), to
6463 use Java's namespace separator symbol ("." instead of "::"), and to output
6464 JArray<TYPE> as TYPE[]. */
6466 char *
6467 java_demangle_v3 (const char *mangled)
6469 size_t alc;
6471 return d_demangle (mangled, DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX, &alc);
6475 java_demangle_v3_callback (const char *mangled,
6476 demangle_callbackref callback, void *opaque)
6478 return d_demangle_callback (mangled,
6479 DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX,
6480 callback, opaque);
6483 #endif /* IN_LIBGCC2 || IN_GLIBCPP_V3 */
6485 #ifndef IN_GLIBCPP_V3
6487 /* Demangle a string in order to find out whether it is a constructor
6488 or destructor. Return non-zero on success. Set *CTOR_KIND and
6489 *DTOR_KIND appropriately. */
6491 static int
6492 is_ctor_or_dtor (const char *mangled,
6493 enum gnu_v3_ctor_kinds *ctor_kind,
6494 enum gnu_v3_dtor_kinds *dtor_kind)
6496 struct d_info di;
6497 struct demangle_component *dc;
6498 int ret;
6500 *ctor_kind = (enum gnu_v3_ctor_kinds) 0;
6501 *dtor_kind = (enum gnu_v3_dtor_kinds) 0;
6503 cplus_demangle_init_info (mangled, DMGL_GNU_V3, strlen (mangled), &di);
6506 #ifdef CP_DYNAMIC_ARRAYS
6507 __extension__ struct demangle_component comps[di.num_comps];
6508 __extension__ struct demangle_component *subs[di.num_subs];
6510 di.comps = comps;
6511 di.subs = subs;
6512 #else
6513 di.comps = alloca (di.num_comps * sizeof (*di.comps));
6514 di.subs = alloca (di.num_subs * sizeof (*di.subs));
6515 #endif
6517 dc = cplus_demangle_mangled_name (&di, 1);
6519 /* Note that because we did not pass DMGL_PARAMS, we don't expect
6520 to demangle the entire string. */
6522 ret = 0;
6523 while (dc != NULL)
6525 switch (dc->type)
6527 /* These cannot appear on a constructor or destructor. */
6528 case DEMANGLE_COMPONENT_RESTRICT_THIS:
6529 case DEMANGLE_COMPONENT_VOLATILE_THIS:
6530 case DEMANGLE_COMPONENT_CONST_THIS:
6531 case DEMANGLE_COMPONENT_REFERENCE_THIS:
6532 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
6533 default:
6534 dc = NULL;
6535 break;
6536 case DEMANGLE_COMPONENT_TYPED_NAME:
6537 case DEMANGLE_COMPONENT_TEMPLATE:
6538 dc = d_left (dc);
6539 break;
6540 case DEMANGLE_COMPONENT_QUAL_NAME:
6541 case DEMANGLE_COMPONENT_LOCAL_NAME:
6542 dc = d_right (dc);
6543 break;
6544 case DEMANGLE_COMPONENT_CTOR:
6545 *ctor_kind = dc->u.s_ctor.kind;
6546 ret = 1;
6547 dc = NULL;
6548 break;
6549 case DEMANGLE_COMPONENT_DTOR:
6550 *dtor_kind = dc->u.s_dtor.kind;
6551 ret = 1;
6552 dc = NULL;
6553 break;
6558 return ret;
6561 /* Return whether NAME is the mangled form of a g++ V3 ABI constructor
6562 name. A non-zero return indicates the type of constructor. */
6564 enum gnu_v3_ctor_kinds
6565 is_gnu_v3_mangled_ctor (const char *name)
6567 enum gnu_v3_ctor_kinds ctor_kind;
6568 enum gnu_v3_dtor_kinds dtor_kind;
6570 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
6571 return (enum gnu_v3_ctor_kinds) 0;
6572 return ctor_kind;
6576 /* Return whether NAME is the mangled form of a g++ V3 ABI destructor
6577 name. A non-zero return indicates the type of destructor. */
6579 enum gnu_v3_dtor_kinds
6580 is_gnu_v3_mangled_dtor (const char *name)
6582 enum gnu_v3_ctor_kinds ctor_kind;
6583 enum gnu_v3_dtor_kinds dtor_kind;
6585 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
6586 return (enum gnu_v3_dtor_kinds) 0;
6587 return dtor_kind;
6590 #endif /* IN_GLIBCPP_V3 */
6592 #ifdef STANDALONE_DEMANGLER
6594 #include "getopt.h"
6595 #include "dyn-string.h"
6597 static void print_usage (FILE* fp, int exit_value);
6599 #define IS_ALPHA(CHAR) \
6600 (((CHAR) >= 'a' && (CHAR) <= 'z') \
6601 || ((CHAR) >= 'A' && (CHAR) <= 'Z'))
6603 /* Non-zero if CHAR is a character than can occur in a mangled name. */
6604 #define is_mangled_char(CHAR) \
6605 (IS_ALPHA (CHAR) || IS_DIGIT (CHAR) \
6606 || (CHAR) == '_' || (CHAR) == '.' || (CHAR) == '$')
6608 /* The name of this program, as invoked. */
6609 const char* program_name;
6611 /* Prints usage summary to FP and then exits with EXIT_VALUE. */
6613 static void
6614 print_usage (FILE* fp, int exit_value)
6616 fprintf (fp, "Usage: %s [options] [names ...]\n", program_name);
6617 fprintf (fp, "Options:\n");
6618 fprintf (fp, " -h,--help Display this message.\n");
6619 fprintf (fp, " -p,--no-params Don't display function parameters\n");
6620 fprintf (fp, " -v,--verbose Produce verbose demanglings.\n");
6621 fprintf (fp, "If names are provided, they are demangled. Otherwise filters standard input.\n");
6623 exit (exit_value);
6626 /* Option specification for getopt_long. */
6627 static const struct option long_options[] =
6629 { "help", no_argument, NULL, 'h' },
6630 { "no-params", no_argument, NULL, 'p' },
6631 { "verbose", no_argument, NULL, 'v' },
6632 { NULL, no_argument, NULL, 0 },
6635 /* Main entry for a demangling filter executable. It will demangle
6636 its command line arguments, if any. If none are provided, it will
6637 filter stdin to stdout, replacing any recognized mangled C++ names
6638 with their demangled equivalents. */
6641 main (int argc, char *argv[])
6643 int i;
6644 int opt_char;
6645 int options = DMGL_PARAMS | DMGL_ANSI | DMGL_TYPES;
6647 /* Use the program name of this program, as invoked. */
6648 program_name = argv[0];
6650 /* Parse options. */
6653 opt_char = getopt_long (argc, argv, "hpv", long_options, NULL);
6654 switch (opt_char)
6656 case '?': /* Unrecognized option. */
6657 print_usage (stderr, 1);
6658 break;
6660 case 'h':
6661 print_usage (stdout, 0);
6662 break;
6664 case 'p':
6665 options &= ~ DMGL_PARAMS;
6666 break;
6668 case 'v':
6669 options |= DMGL_VERBOSE;
6670 break;
6673 while (opt_char != -1);
6675 if (optind == argc)
6676 /* No command line arguments were provided. Filter stdin. */
6678 dyn_string_t mangled = dyn_string_new (3);
6679 char *s;
6681 /* Read all of input. */
6682 while (!feof (stdin))
6684 char c;
6686 /* Pile characters into mangled until we hit one that can't
6687 occur in a mangled name. */
6688 c = getchar ();
6689 while (!feof (stdin) && is_mangled_char (c))
6691 dyn_string_append_char (mangled, c);
6692 if (feof (stdin))
6693 break;
6694 c = getchar ();
6697 if (dyn_string_length (mangled) > 0)
6699 #ifdef IN_GLIBCPP_V3
6700 s = __cxa_demangle (dyn_string_buf (mangled), NULL, NULL, NULL);
6701 #else
6702 s = cplus_demangle_v3 (dyn_string_buf (mangled), options);
6703 #endif
6705 if (s != NULL)
6707 fputs (s, stdout);
6708 free (s);
6710 else
6712 /* It might not have been a mangled name. Print the
6713 original text. */
6714 fputs (dyn_string_buf (mangled), stdout);
6717 dyn_string_clear (mangled);
6720 /* If we haven't hit EOF yet, we've read one character that
6721 can't occur in a mangled name, so print it out. */
6722 if (!feof (stdin))
6723 putchar (c);
6726 dyn_string_delete (mangled);
6728 else
6729 /* Demangle command line arguments. */
6731 /* Loop over command line arguments. */
6732 for (i = optind; i < argc; ++i)
6734 char *s;
6735 #ifdef IN_GLIBCPP_V3
6736 int status;
6737 #endif
6739 /* Attempt to demangle. */
6740 #ifdef IN_GLIBCPP_V3
6741 s = __cxa_demangle (argv[i], NULL, NULL, &status);
6742 #else
6743 s = cplus_demangle_v3 (argv[i], options);
6744 #endif
6746 /* If it worked, print the demangled name. */
6747 if (s != NULL)
6749 printf ("%s\n", s);
6750 free (s);
6752 else
6754 #ifdef IN_GLIBCPP_V3
6755 fprintf (stderr, "Failed: %s (status %d)\n", argv[i], status);
6756 #else
6757 fprintf (stderr, "Failed: %s\n", argv[i]);
6758 #endif
6763 return 0;
6766 #endif /* STANDALONE_DEMANGLER */