2016-08-24 Michael Collison <michael.collison@linaro.org>
[official-gcc.git] / libiberty / cp-demangle.c
blob1c2bce291797824c071abeeb5252d2d5df3855ad
1 /* Demangler for g++ V3 ABI.
2 Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2014
3 Free Software Foundation, Inc.
4 Written by Ian Lance Taylor <ian@wasabisystems.com>.
6 This file is part of the libiberty library, which is part of GCC.
8 This file is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 In addition to the permissions in the GNU General Public License, the
14 Free Software Foundation gives you unlimited permission to link the
15 compiled version of this file into combinations with other programs,
16 and to distribute those combinations without any restriction coming
17 from the use of this file. (The General Public License restrictions
18 do apply in other respects; for example, they cover modification of
19 the file, and distribution when not linked into a combined
20 executable.)
22 This program is distributed in the hope that it will be useful,
23 but WITHOUT ANY WARRANTY; without even the implied warranty of
24 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25 GNU General Public License for more details.
27 You should have received a copy of the GNU General Public License
28 along with this program; if not, write to the Free Software
29 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
32 /* This code implements a demangler for the g++ V3 ABI. The ABI is
33 described on this web page:
34 http://www.codesourcery.com/cxx-abi/abi.html#mangling
36 This code was written while looking at the demangler written by
37 Alex Samuel <samuel@codesourcery.com>.
39 This code first pulls the mangled name apart into a list of
40 components, and then walks the list generating the demangled
41 name.
43 This file will normally define the following functions, q.v.:
44 char *cplus_demangle_v3(const char *mangled, int options)
45 char *java_demangle_v3(const char *mangled)
46 int cplus_demangle_v3_callback(const char *mangled, int options,
47 demangle_callbackref callback)
48 int java_demangle_v3_callback(const char *mangled,
49 demangle_callbackref callback)
50 enum gnu_v3_ctor_kinds is_gnu_v3_mangled_ctor (const char *name)
51 enum gnu_v3_dtor_kinds is_gnu_v3_mangled_dtor (const char *name)
53 Also, the interface to the component list is public, and defined in
54 demangle.h. The interface consists of these types, which are
55 defined in demangle.h:
56 enum demangle_component_type
57 struct demangle_component
58 demangle_callbackref
59 and these functions defined in this file:
60 cplus_demangle_fill_name
61 cplus_demangle_fill_extended_operator
62 cplus_demangle_fill_ctor
63 cplus_demangle_fill_dtor
64 cplus_demangle_print
65 cplus_demangle_print_callback
66 and other functions defined in the file cp-demint.c.
68 This file also defines some other functions and variables which are
69 only to be used by the file cp-demint.c.
71 Preprocessor macros you can define while compiling this file:
73 IN_LIBGCC2
74 If defined, this file defines the following functions, q.v.:
75 char *__cxa_demangle (const char *mangled, char *buf, size_t *len,
76 int *status)
77 int __gcclibcxx_demangle_callback (const char *,
78 void (*)
79 (const char *, size_t, void *),
80 void *)
81 instead of cplus_demangle_v3[_callback]() and
82 java_demangle_v3[_callback]().
84 IN_GLIBCPP_V3
85 If defined, this file defines only __cxa_demangle() and
86 __gcclibcxx_demangle_callback(), and no other publically visible
87 functions or variables.
89 STANDALONE_DEMANGLER
90 If defined, this file defines a main() function which demangles
91 any arguments, or, if none, demangles stdin.
93 CP_DEMANGLE_DEBUG
94 If defined, turns on debugging mode, which prints information on
95 stdout about the mangled string. This is not generally useful.
97 CHECK_DEMANGLER
98 If defined, additional sanity checks will be performed. It will
99 cause some slowdown, but will allow to catch out-of-bound access
100 errors earlier. This macro is intended for testing and debugging. */
102 #if defined (_AIX) && !defined (__GNUC__)
103 #pragma alloca
104 #endif
106 #ifdef HAVE_CONFIG_H
107 #include "config.h"
108 #endif
110 #include <stdio.h>
112 #ifdef HAVE_STDLIB_H
113 #include <stdlib.h>
114 #endif
115 #ifdef HAVE_STRING_H
116 #include <string.h>
117 #endif
119 #ifdef HAVE_ALLOCA_H
120 # include <alloca.h>
121 #else
122 # ifndef alloca
123 # ifdef __GNUC__
124 # define alloca __builtin_alloca
125 # else
126 extern char *alloca ();
127 # endif /* __GNUC__ */
128 # endif /* alloca */
129 #endif /* HAVE_ALLOCA_H */
131 #ifdef HAVE_LIMITS_H
132 #include <limits.h>
133 #endif
134 #ifndef INT_MAX
135 # define INT_MAX (int)(((unsigned int) ~0) >> 1) /* 0x7FFFFFFF */
136 #endif
138 #include "ansidecl.h"
139 #include "libiberty.h"
140 #include "demangle.h"
141 #include "cp-demangle.h"
143 /* If IN_GLIBCPP_V3 is defined, some functions are made static. We
144 also rename them via #define to avoid compiler errors when the
145 static definition conflicts with the extern declaration in a header
146 file. */
147 #ifdef IN_GLIBCPP_V3
149 #define CP_STATIC_IF_GLIBCPP_V3 static
151 #define cplus_demangle_fill_name d_fill_name
152 static int d_fill_name (struct demangle_component *, const char *, int);
154 #define cplus_demangle_fill_extended_operator d_fill_extended_operator
155 static int
156 d_fill_extended_operator (struct demangle_component *, int,
157 struct demangle_component *);
159 #define cplus_demangle_fill_ctor d_fill_ctor
160 static int
161 d_fill_ctor (struct demangle_component *, enum gnu_v3_ctor_kinds,
162 struct demangle_component *);
164 #define cplus_demangle_fill_dtor d_fill_dtor
165 static int
166 d_fill_dtor (struct demangle_component *, enum gnu_v3_dtor_kinds,
167 struct demangle_component *);
169 #define cplus_demangle_mangled_name d_mangled_name
170 static struct demangle_component *d_mangled_name (struct d_info *, int);
172 #define cplus_demangle_type d_type
173 static struct demangle_component *d_type (struct d_info *);
175 #define cplus_demangle_print d_print
176 static char *d_print (int, const struct demangle_component *, int, size_t *);
178 #define cplus_demangle_print_callback d_print_callback
179 static int d_print_callback (int, const struct demangle_component *,
180 demangle_callbackref, void *);
182 #define cplus_demangle_init_info d_init_info
183 static void d_init_info (const char *, int, size_t, struct d_info *);
185 #else /* ! defined(IN_GLIBCPP_V3) */
186 #define CP_STATIC_IF_GLIBCPP_V3
187 #endif /* ! defined(IN_GLIBCPP_V3) */
189 /* See if the compiler supports dynamic arrays. */
191 #ifdef __GNUC__
192 #define CP_DYNAMIC_ARRAYS
193 #else
194 #ifdef __STDC__
195 #ifdef __STDC_VERSION__
196 #if __STDC_VERSION__ >= 199901L
197 #define CP_DYNAMIC_ARRAYS
198 #endif /* __STDC__VERSION >= 199901L */
199 #endif /* defined (__STDC_VERSION__) */
200 #endif /* defined (__STDC__) */
201 #endif /* ! defined (__GNUC__) */
203 /* We avoid pulling in the ctype tables, to prevent pulling in
204 additional unresolved symbols when this code is used in a library.
205 FIXME: Is this really a valid reason? This comes from the original
206 V3 demangler code.
208 As of this writing this file has the following undefined references
209 when compiled with -DIN_GLIBCPP_V3: realloc, free, memcpy, strcpy,
210 strcat, strlen. */
212 #define IS_DIGIT(c) ((c) >= '0' && (c) <= '9')
213 #define IS_UPPER(c) ((c) >= 'A' && (c) <= 'Z')
214 #define IS_LOWER(c) ((c) >= 'a' && (c) <= 'z')
216 /* The prefix prepended by GCC to an identifier represnting the
217 anonymous namespace. */
218 #define ANONYMOUS_NAMESPACE_PREFIX "_GLOBAL_"
219 #define ANONYMOUS_NAMESPACE_PREFIX_LEN \
220 (sizeof (ANONYMOUS_NAMESPACE_PREFIX) - 1)
222 /* Information we keep for the standard substitutions. */
224 struct d_standard_sub_info
226 /* The code for this substitution. */
227 char code;
228 /* The simple string it expands to. */
229 const char *simple_expansion;
230 /* The length of the simple expansion. */
231 int simple_len;
232 /* The results of a full, verbose, expansion. This is used when
233 qualifying a constructor/destructor, or when in verbose mode. */
234 const char *full_expansion;
235 /* The length of the full expansion. */
236 int full_len;
237 /* What to set the last_name field of d_info to; NULL if we should
238 not set it. This is only relevant when qualifying a
239 constructor/destructor. */
240 const char *set_last_name;
241 /* The length of set_last_name. */
242 int set_last_name_len;
245 /* Accessors for subtrees of struct demangle_component. */
247 #define d_left(dc) ((dc)->u.s_binary.left)
248 #define d_right(dc) ((dc)->u.s_binary.right)
250 /* A list of templates. This is used while printing. */
252 struct d_print_template
254 /* Next template on the list. */
255 struct d_print_template *next;
256 /* This template. */
257 const struct demangle_component *template_decl;
260 /* A list of type modifiers. This is used while printing. */
262 struct d_print_mod
264 /* Next modifier on the list. These are in the reverse of the order
265 in which they appeared in the mangled string. */
266 struct d_print_mod *next;
267 /* The modifier. */
268 const struct demangle_component *mod;
269 /* Whether this modifier was printed. */
270 int printed;
271 /* The list of templates which applies to this modifier. */
272 struct d_print_template *templates;
275 /* We use these structures to hold information during printing. */
277 struct d_growable_string
279 /* Buffer holding the result. */
280 char *buf;
281 /* Current length of data in buffer. */
282 size_t len;
283 /* Allocated size of buffer. */
284 size_t alc;
285 /* Set to 1 if we had a memory allocation failure. */
286 int allocation_failure;
289 /* Stack of components, innermost first, used to avoid loops. */
291 struct d_component_stack
293 /* This component. */
294 const struct demangle_component *dc;
295 /* This component's parent. */
296 const struct d_component_stack *parent;
299 /* A demangle component and some scope captured when it was first
300 traversed. */
302 struct d_saved_scope
304 /* The component whose scope this is. */
305 const struct demangle_component *container;
306 /* The list of templates, if any, that was current when this
307 scope was captured. */
308 struct d_print_template *templates;
311 /* Checkpoint structure to allow backtracking. This holds copies
312 of the fields of struct d_info that need to be restored
313 if a trial parse needs to be backtracked over. */
315 struct d_info_checkpoint
317 const char *n;
318 int next_comp;
319 int next_sub;
320 int did_subs;
321 int expansion;
324 enum { D_PRINT_BUFFER_LENGTH = 256 };
325 struct d_print_info
327 /* Fixed-length allocated buffer for demangled data, flushed to the
328 callback with a NUL termination once full. */
329 char buf[D_PRINT_BUFFER_LENGTH];
330 /* Current length of data in buffer. */
331 size_t len;
332 /* The last character printed, saved individually so that it survives
333 any buffer flush. */
334 char last_char;
335 /* Callback function to handle demangled buffer flush. */
336 demangle_callbackref callback;
337 /* Opaque callback argument. */
338 void *opaque;
339 /* The current list of templates, if any. */
340 struct d_print_template *templates;
341 /* The current list of modifiers (e.g., pointer, reference, etc.),
342 if any. */
343 struct d_print_mod *modifiers;
344 /* Set to 1 if we saw a demangling error. */
345 int demangle_failure;
346 /* The current index into any template argument packs we are using
347 for printing, or -1 to print the whole pack. */
348 int pack_index;
349 /* Number of d_print_flush calls so far. */
350 unsigned long int flush_count;
351 /* Stack of components, innermost first, used to avoid loops. */
352 const struct d_component_stack *component_stack;
353 /* Array of saved scopes for evaluating substitutions. */
354 struct d_saved_scope *saved_scopes;
355 /* Index of the next unused saved scope in the above array. */
356 int next_saved_scope;
357 /* Number of saved scopes in the above array. */
358 int num_saved_scopes;
359 /* Array of templates for saving into scopes. */
360 struct d_print_template *copy_templates;
361 /* Index of the next unused copy template in the above array. */
362 int next_copy_template;
363 /* Number of copy templates in the above array. */
364 int num_copy_templates;
365 /* The nearest enclosing template, if any. */
366 const struct demangle_component *current_template;
369 #ifdef CP_DEMANGLE_DEBUG
370 static void d_dump (struct demangle_component *, int);
371 #endif
373 static struct demangle_component *
374 d_make_empty (struct d_info *);
376 static struct demangle_component *
377 d_make_comp (struct d_info *, enum demangle_component_type,
378 struct demangle_component *,
379 struct demangle_component *);
381 static struct demangle_component *
382 d_make_name (struct d_info *, const char *, int);
384 static struct demangle_component *
385 d_make_demangle_mangled_name (struct d_info *, const char *);
387 static struct demangle_component *
388 d_make_builtin_type (struct d_info *,
389 const struct demangle_builtin_type_info *);
391 static struct demangle_component *
392 d_make_operator (struct d_info *,
393 const struct demangle_operator_info *);
395 static struct demangle_component *
396 d_make_extended_operator (struct d_info *, int,
397 struct demangle_component *);
399 static struct demangle_component *
400 d_make_ctor (struct d_info *, enum gnu_v3_ctor_kinds,
401 struct demangle_component *);
403 static struct demangle_component *
404 d_make_dtor (struct d_info *, enum gnu_v3_dtor_kinds,
405 struct demangle_component *);
407 static struct demangle_component *
408 d_make_template_param (struct d_info *, int);
410 static struct demangle_component *
411 d_make_sub (struct d_info *, const char *, int);
413 static int
414 has_return_type (struct demangle_component *);
416 static int
417 is_ctor_dtor_or_conversion (struct demangle_component *);
419 static struct demangle_component *d_encoding (struct d_info *, int);
421 static struct demangle_component *d_name (struct d_info *);
423 static struct demangle_component *d_nested_name (struct d_info *);
425 static struct demangle_component *d_prefix (struct d_info *);
427 static struct demangle_component *d_unqualified_name (struct d_info *);
429 static struct demangle_component *d_source_name (struct d_info *);
431 static int d_number (struct d_info *);
433 static struct demangle_component *d_identifier (struct d_info *, int);
435 static struct demangle_component *d_operator_name (struct d_info *);
437 static struct demangle_component *d_special_name (struct d_info *);
439 static int d_call_offset (struct d_info *, int);
441 static struct demangle_component *d_ctor_dtor_name (struct d_info *);
443 static struct demangle_component **
444 d_cv_qualifiers (struct d_info *, struct demangle_component **, int);
446 static struct demangle_component *
447 d_ref_qualifier (struct d_info *, struct demangle_component *);
449 static struct demangle_component *
450 d_function_type (struct d_info *);
452 static struct demangle_component *
453 d_bare_function_type (struct d_info *, int);
455 static struct demangle_component *
456 d_class_enum_type (struct d_info *);
458 static struct demangle_component *d_array_type (struct d_info *);
460 static struct demangle_component *d_vector_type (struct d_info *);
462 static struct demangle_component *
463 d_pointer_to_member_type (struct d_info *);
465 static struct demangle_component *
466 d_template_param (struct d_info *);
468 static struct demangle_component *d_template_args (struct d_info *);
469 static struct demangle_component *d_template_args_1 (struct d_info *);
471 static struct demangle_component *
472 d_template_arg (struct d_info *);
474 static struct demangle_component *d_expression (struct d_info *);
476 static struct demangle_component *d_expr_primary (struct d_info *);
478 static struct demangle_component *d_local_name (struct d_info *);
480 static int d_discriminator (struct d_info *);
482 static struct demangle_component *d_lambda (struct d_info *);
484 static struct demangle_component *d_unnamed_type (struct d_info *);
486 static struct demangle_component *
487 d_clone_suffix (struct d_info *, struct demangle_component *);
489 static int
490 d_add_substitution (struct d_info *, struct demangle_component *);
492 static struct demangle_component *d_substitution (struct d_info *, int);
494 static void d_checkpoint (struct d_info *, struct d_info_checkpoint *);
496 static void d_backtrack (struct d_info *, struct d_info_checkpoint *);
498 static void d_growable_string_init (struct d_growable_string *, size_t);
500 static inline void
501 d_growable_string_resize (struct d_growable_string *, size_t);
503 static inline void
504 d_growable_string_append_buffer (struct d_growable_string *,
505 const char *, size_t);
506 static void
507 d_growable_string_callback_adapter (const char *, size_t, void *);
509 static void
510 d_print_init (struct d_print_info *, demangle_callbackref, void *,
511 const struct demangle_component *);
513 static inline void d_print_error (struct d_print_info *);
515 static inline int d_print_saw_error (struct d_print_info *);
517 static inline void d_print_flush (struct d_print_info *);
519 static inline void d_append_char (struct d_print_info *, char);
521 static inline void d_append_buffer (struct d_print_info *,
522 const char *, size_t);
524 static inline void d_append_string (struct d_print_info *, const char *);
526 static inline char d_last_char (struct d_print_info *);
528 static void
529 d_print_comp (struct d_print_info *, int, const struct demangle_component *);
531 static void
532 d_print_java_identifier (struct d_print_info *, const char *, int);
534 static void
535 d_print_mod_list (struct d_print_info *, int, struct d_print_mod *, int);
537 static void
538 d_print_mod (struct d_print_info *, int, const struct demangle_component *);
540 static void
541 d_print_function_type (struct d_print_info *, int,
542 const struct demangle_component *,
543 struct d_print_mod *);
545 static void
546 d_print_array_type (struct d_print_info *, int,
547 const struct demangle_component *,
548 struct d_print_mod *);
550 static void
551 d_print_expr_op (struct d_print_info *, int, const struct demangle_component *);
553 static void d_print_cast (struct d_print_info *, int,
554 const struct demangle_component *);
555 static void d_print_conversion (struct d_print_info *, int,
556 const struct demangle_component *);
558 static int d_demangle_callback (const char *, int,
559 demangle_callbackref, void *);
560 static char *d_demangle (const char *, int, size_t *);
562 #ifdef CP_DEMANGLE_DEBUG
564 static void
565 d_dump (struct demangle_component *dc, int indent)
567 int i;
569 if (dc == NULL)
571 if (indent == 0)
572 printf ("failed demangling\n");
573 return;
576 for (i = 0; i < indent; ++i)
577 putchar (' ');
579 switch (dc->type)
581 case DEMANGLE_COMPONENT_NAME:
582 printf ("name '%.*s'\n", dc->u.s_name.len, dc->u.s_name.s);
583 return;
584 case DEMANGLE_COMPONENT_TAGGED_NAME:
585 printf ("tagged name\n");
586 d_dump (dc->u.s_binary.left, indent + 2);
587 d_dump (dc->u.s_binary.right, indent + 2);
588 return;
589 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
590 printf ("template parameter %ld\n", dc->u.s_number.number);
591 return;
592 case DEMANGLE_COMPONENT_FUNCTION_PARAM:
593 printf ("function parameter %ld\n", dc->u.s_number.number);
594 return;
595 case DEMANGLE_COMPONENT_CTOR:
596 printf ("constructor %d\n", (int) dc->u.s_ctor.kind);
597 d_dump (dc->u.s_ctor.name, indent + 2);
598 return;
599 case DEMANGLE_COMPONENT_DTOR:
600 printf ("destructor %d\n", (int) dc->u.s_dtor.kind);
601 d_dump (dc->u.s_dtor.name, indent + 2);
602 return;
603 case DEMANGLE_COMPONENT_SUB_STD:
604 printf ("standard substitution %s\n", dc->u.s_string.string);
605 return;
606 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
607 printf ("builtin type %s\n", dc->u.s_builtin.type->name);
608 return;
609 case DEMANGLE_COMPONENT_OPERATOR:
610 printf ("operator %s\n", dc->u.s_operator.op->name);
611 return;
612 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
613 printf ("extended operator with %d args\n",
614 dc->u.s_extended_operator.args);
615 d_dump (dc->u.s_extended_operator.name, indent + 2);
616 return;
618 case DEMANGLE_COMPONENT_QUAL_NAME:
619 printf ("qualified name\n");
620 break;
621 case DEMANGLE_COMPONENT_LOCAL_NAME:
622 printf ("local name\n");
623 break;
624 case DEMANGLE_COMPONENT_TYPED_NAME:
625 printf ("typed name\n");
626 break;
627 case DEMANGLE_COMPONENT_TEMPLATE:
628 printf ("template\n");
629 break;
630 case DEMANGLE_COMPONENT_VTABLE:
631 printf ("vtable\n");
632 break;
633 case DEMANGLE_COMPONENT_VTT:
634 printf ("VTT\n");
635 break;
636 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
637 printf ("construction vtable\n");
638 break;
639 case DEMANGLE_COMPONENT_TYPEINFO:
640 printf ("typeinfo\n");
641 break;
642 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
643 printf ("typeinfo name\n");
644 break;
645 case DEMANGLE_COMPONENT_TYPEINFO_FN:
646 printf ("typeinfo function\n");
647 break;
648 case DEMANGLE_COMPONENT_THUNK:
649 printf ("thunk\n");
650 break;
651 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
652 printf ("virtual thunk\n");
653 break;
654 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
655 printf ("covariant thunk\n");
656 break;
657 case DEMANGLE_COMPONENT_JAVA_CLASS:
658 printf ("java class\n");
659 break;
660 case DEMANGLE_COMPONENT_GUARD:
661 printf ("guard\n");
662 break;
663 case DEMANGLE_COMPONENT_REFTEMP:
664 printf ("reference temporary\n");
665 break;
666 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
667 printf ("hidden alias\n");
668 break;
669 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
670 printf ("transaction clone\n");
671 break;
672 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
673 printf ("non-transaction clone\n");
674 break;
675 case DEMANGLE_COMPONENT_RESTRICT:
676 printf ("restrict\n");
677 break;
678 case DEMANGLE_COMPONENT_VOLATILE:
679 printf ("volatile\n");
680 break;
681 case DEMANGLE_COMPONENT_CONST:
682 printf ("const\n");
683 break;
684 case DEMANGLE_COMPONENT_RESTRICT_THIS:
685 printf ("restrict this\n");
686 break;
687 case DEMANGLE_COMPONENT_VOLATILE_THIS:
688 printf ("volatile this\n");
689 break;
690 case DEMANGLE_COMPONENT_CONST_THIS:
691 printf ("const this\n");
692 break;
693 case DEMANGLE_COMPONENT_REFERENCE_THIS:
694 printf ("reference this\n");
695 break;
696 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
697 printf ("rvalue reference this\n");
698 break;
699 case DEMANGLE_COMPONENT_TRANSACTION_SAFE:
700 printf ("transaction_safe this\n");
701 break;
702 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
703 printf ("vendor type qualifier\n");
704 break;
705 case DEMANGLE_COMPONENT_POINTER:
706 printf ("pointer\n");
707 break;
708 case DEMANGLE_COMPONENT_REFERENCE:
709 printf ("reference\n");
710 break;
711 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
712 printf ("rvalue reference\n");
713 break;
714 case DEMANGLE_COMPONENT_COMPLEX:
715 printf ("complex\n");
716 break;
717 case DEMANGLE_COMPONENT_IMAGINARY:
718 printf ("imaginary\n");
719 break;
720 case DEMANGLE_COMPONENT_VENDOR_TYPE:
721 printf ("vendor type\n");
722 break;
723 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
724 printf ("function type\n");
725 break;
726 case DEMANGLE_COMPONENT_ARRAY_TYPE:
727 printf ("array type\n");
728 break;
729 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
730 printf ("pointer to member type\n");
731 break;
732 case DEMANGLE_COMPONENT_FIXED_TYPE:
733 printf ("fixed-point type, accum? %d, sat? %d\n",
734 dc->u.s_fixed.accum, dc->u.s_fixed.sat);
735 d_dump (dc->u.s_fixed.length, indent + 2);
736 break;
737 case DEMANGLE_COMPONENT_ARGLIST:
738 printf ("argument list\n");
739 break;
740 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
741 printf ("template argument list\n");
742 break;
743 case DEMANGLE_COMPONENT_INITIALIZER_LIST:
744 printf ("initializer list\n");
745 break;
746 case DEMANGLE_COMPONENT_CAST:
747 printf ("cast\n");
748 break;
749 case DEMANGLE_COMPONENT_CONVERSION:
750 printf ("conversion operator\n");
751 break;
752 case DEMANGLE_COMPONENT_NULLARY:
753 printf ("nullary operator\n");
754 break;
755 case DEMANGLE_COMPONENT_UNARY:
756 printf ("unary operator\n");
757 break;
758 case DEMANGLE_COMPONENT_BINARY:
759 printf ("binary operator\n");
760 break;
761 case DEMANGLE_COMPONENT_BINARY_ARGS:
762 printf ("binary operator arguments\n");
763 break;
764 case DEMANGLE_COMPONENT_TRINARY:
765 printf ("trinary operator\n");
766 break;
767 case DEMANGLE_COMPONENT_TRINARY_ARG1:
768 printf ("trinary operator arguments 1\n");
769 break;
770 case DEMANGLE_COMPONENT_TRINARY_ARG2:
771 printf ("trinary operator arguments 1\n");
772 break;
773 case DEMANGLE_COMPONENT_LITERAL:
774 printf ("literal\n");
775 break;
776 case DEMANGLE_COMPONENT_LITERAL_NEG:
777 printf ("negative literal\n");
778 break;
779 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
780 printf ("java resource\n");
781 break;
782 case DEMANGLE_COMPONENT_COMPOUND_NAME:
783 printf ("compound name\n");
784 break;
785 case DEMANGLE_COMPONENT_CHARACTER:
786 printf ("character '%c'\n", dc->u.s_character.character);
787 return;
788 case DEMANGLE_COMPONENT_NUMBER:
789 printf ("number %ld\n", dc->u.s_number.number);
790 return;
791 case DEMANGLE_COMPONENT_DECLTYPE:
792 printf ("decltype\n");
793 break;
794 case DEMANGLE_COMPONENT_PACK_EXPANSION:
795 printf ("pack expansion\n");
796 break;
797 case DEMANGLE_COMPONENT_TLS_INIT:
798 printf ("tls init function\n");
799 break;
800 case DEMANGLE_COMPONENT_TLS_WRAPPER:
801 printf ("tls wrapper function\n");
802 break;
803 case DEMANGLE_COMPONENT_DEFAULT_ARG:
804 printf ("default argument %d\n", dc->u.s_unary_num.num);
805 d_dump (dc->u.s_unary_num.sub, indent+2);
806 return;
807 case DEMANGLE_COMPONENT_LAMBDA:
808 printf ("lambda %d\n", dc->u.s_unary_num.num);
809 d_dump (dc->u.s_unary_num.sub, indent+2);
810 return;
813 d_dump (d_left (dc), indent + 2);
814 d_dump (d_right (dc), indent + 2);
817 #endif /* CP_DEMANGLE_DEBUG */
819 /* Fill in a DEMANGLE_COMPONENT_NAME. */
821 CP_STATIC_IF_GLIBCPP_V3
823 cplus_demangle_fill_name (struct demangle_component *p, const char *s, int len)
825 if (p == NULL || s == NULL || len == 0)
826 return 0;
827 p->type = DEMANGLE_COMPONENT_NAME;
828 p->u.s_name.s = s;
829 p->u.s_name.len = len;
830 return 1;
833 /* Fill in a DEMANGLE_COMPONENT_EXTENDED_OPERATOR. */
835 CP_STATIC_IF_GLIBCPP_V3
837 cplus_demangle_fill_extended_operator (struct demangle_component *p, int args,
838 struct demangle_component *name)
840 if (p == NULL || args < 0 || name == NULL)
841 return 0;
842 p->type = DEMANGLE_COMPONENT_EXTENDED_OPERATOR;
843 p->u.s_extended_operator.args = args;
844 p->u.s_extended_operator.name = name;
845 return 1;
848 /* Fill in a DEMANGLE_COMPONENT_CTOR. */
850 CP_STATIC_IF_GLIBCPP_V3
852 cplus_demangle_fill_ctor (struct demangle_component *p,
853 enum gnu_v3_ctor_kinds kind,
854 struct demangle_component *name)
856 if (p == NULL
857 || name == NULL
858 || (int) kind < gnu_v3_complete_object_ctor
859 || (int) kind > gnu_v3_object_ctor_group)
860 return 0;
861 p->type = DEMANGLE_COMPONENT_CTOR;
862 p->u.s_ctor.kind = kind;
863 p->u.s_ctor.name = name;
864 return 1;
867 /* Fill in a DEMANGLE_COMPONENT_DTOR. */
869 CP_STATIC_IF_GLIBCPP_V3
871 cplus_demangle_fill_dtor (struct demangle_component *p,
872 enum gnu_v3_dtor_kinds kind,
873 struct demangle_component *name)
875 if (p == NULL
876 || name == NULL
877 || (int) kind < gnu_v3_deleting_dtor
878 || (int) kind > gnu_v3_object_dtor_group)
879 return 0;
880 p->type = DEMANGLE_COMPONENT_DTOR;
881 p->u.s_dtor.kind = kind;
882 p->u.s_dtor.name = name;
883 return 1;
886 /* Add a new component. */
888 static struct demangle_component *
889 d_make_empty (struct d_info *di)
891 struct demangle_component *p;
893 if (di->next_comp >= di->num_comps)
894 return NULL;
895 p = &di->comps[di->next_comp];
896 ++di->next_comp;
897 return p;
900 /* Add a new generic component. */
902 static struct demangle_component *
903 d_make_comp (struct d_info *di, enum demangle_component_type type,
904 struct demangle_component *left,
905 struct demangle_component *right)
907 struct demangle_component *p;
909 /* We check for errors here. A typical error would be a NULL return
910 from a subroutine. We catch those here, and return NULL
911 upward. */
912 switch (type)
914 /* These types require two parameters. */
915 case DEMANGLE_COMPONENT_QUAL_NAME:
916 case DEMANGLE_COMPONENT_LOCAL_NAME:
917 case DEMANGLE_COMPONENT_TYPED_NAME:
918 case DEMANGLE_COMPONENT_TAGGED_NAME:
919 case DEMANGLE_COMPONENT_TEMPLATE:
920 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
921 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
922 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
923 case DEMANGLE_COMPONENT_UNARY:
924 case DEMANGLE_COMPONENT_BINARY:
925 case DEMANGLE_COMPONENT_BINARY_ARGS:
926 case DEMANGLE_COMPONENT_TRINARY:
927 case DEMANGLE_COMPONENT_TRINARY_ARG1:
928 case DEMANGLE_COMPONENT_LITERAL:
929 case DEMANGLE_COMPONENT_LITERAL_NEG:
930 case DEMANGLE_COMPONENT_COMPOUND_NAME:
931 case DEMANGLE_COMPONENT_VECTOR_TYPE:
932 case DEMANGLE_COMPONENT_CLONE:
933 if (left == NULL || right == NULL)
934 return NULL;
935 break;
937 /* These types only require one parameter. */
938 case DEMANGLE_COMPONENT_VTABLE:
939 case DEMANGLE_COMPONENT_VTT:
940 case DEMANGLE_COMPONENT_TYPEINFO:
941 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
942 case DEMANGLE_COMPONENT_TYPEINFO_FN:
943 case DEMANGLE_COMPONENT_THUNK:
944 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
945 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
946 case DEMANGLE_COMPONENT_JAVA_CLASS:
947 case DEMANGLE_COMPONENT_GUARD:
948 case DEMANGLE_COMPONENT_TLS_INIT:
949 case DEMANGLE_COMPONENT_TLS_WRAPPER:
950 case DEMANGLE_COMPONENT_REFTEMP:
951 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
952 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
953 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
954 case DEMANGLE_COMPONENT_POINTER:
955 case DEMANGLE_COMPONENT_REFERENCE:
956 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
957 case DEMANGLE_COMPONENT_COMPLEX:
958 case DEMANGLE_COMPONENT_IMAGINARY:
959 case DEMANGLE_COMPONENT_VENDOR_TYPE:
960 case DEMANGLE_COMPONENT_CAST:
961 case DEMANGLE_COMPONENT_CONVERSION:
962 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
963 case DEMANGLE_COMPONENT_DECLTYPE:
964 case DEMANGLE_COMPONENT_PACK_EXPANSION:
965 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
966 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
967 case DEMANGLE_COMPONENT_NULLARY:
968 case DEMANGLE_COMPONENT_TRINARY_ARG2:
969 if (left == NULL)
970 return NULL;
971 break;
973 /* This needs a right parameter, but the left parameter can be
974 empty. */
975 case DEMANGLE_COMPONENT_ARRAY_TYPE:
976 case DEMANGLE_COMPONENT_INITIALIZER_LIST:
977 if (right == NULL)
978 return NULL;
979 break;
981 /* These are allowed to have no parameters--in some cases they
982 will be filled in later. */
983 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
984 case DEMANGLE_COMPONENT_RESTRICT:
985 case DEMANGLE_COMPONENT_VOLATILE:
986 case DEMANGLE_COMPONENT_CONST:
987 case DEMANGLE_COMPONENT_RESTRICT_THIS:
988 case DEMANGLE_COMPONENT_VOLATILE_THIS:
989 case DEMANGLE_COMPONENT_CONST_THIS:
990 case DEMANGLE_COMPONENT_TRANSACTION_SAFE:
991 case DEMANGLE_COMPONENT_REFERENCE_THIS:
992 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
993 case DEMANGLE_COMPONENT_ARGLIST:
994 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
995 break;
997 /* Other types should not be seen here. */
998 default:
999 return NULL;
1002 p = d_make_empty (di);
1003 if (p != NULL)
1005 p->type = type;
1006 p->u.s_binary.left = left;
1007 p->u.s_binary.right = right;
1009 return p;
1012 /* Add a new demangle mangled name component. */
1014 static struct demangle_component *
1015 d_make_demangle_mangled_name (struct d_info *di, const char *s)
1017 if (d_peek_char (di) != '_' || d_peek_next_char (di) != 'Z')
1018 return d_make_name (di, s, strlen (s));
1019 d_advance (di, 2);
1020 return d_encoding (di, 0);
1023 /* Add a new name component. */
1025 static struct demangle_component *
1026 d_make_name (struct d_info *di, const char *s, int len)
1028 struct demangle_component *p;
1030 p = d_make_empty (di);
1031 if (! cplus_demangle_fill_name (p, s, len))
1032 return NULL;
1033 return p;
1036 /* Add a new builtin type component. */
1038 static struct demangle_component *
1039 d_make_builtin_type (struct d_info *di,
1040 const struct demangle_builtin_type_info *type)
1042 struct demangle_component *p;
1044 if (type == NULL)
1045 return NULL;
1046 p = d_make_empty (di);
1047 if (p != NULL)
1049 p->type = DEMANGLE_COMPONENT_BUILTIN_TYPE;
1050 p->u.s_builtin.type = type;
1052 return p;
1055 /* Add a new operator component. */
1057 static struct demangle_component *
1058 d_make_operator (struct d_info *di, const struct demangle_operator_info *op)
1060 struct demangle_component *p;
1062 p = d_make_empty (di);
1063 if (p != NULL)
1065 p->type = DEMANGLE_COMPONENT_OPERATOR;
1066 p->u.s_operator.op = op;
1068 return p;
1071 /* Add a new extended operator component. */
1073 static struct demangle_component *
1074 d_make_extended_operator (struct d_info *di, int args,
1075 struct demangle_component *name)
1077 struct demangle_component *p;
1079 p = d_make_empty (di);
1080 if (! cplus_demangle_fill_extended_operator (p, args, name))
1081 return NULL;
1082 return p;
1085 static struct demangle_component *
1086 d_make_default_arg (struct d_info *di, int num,
1087 struct demangle_component *sub)
1089 struct demangle_component *p = d_make_empty (di);
1090 if (p)
1092 p->type = DEMANGLE_COMPONENT_DEFAULT_ARG;
1093 p->u.s_unary_num.num = num;
1094 p->u.s_unary_num.sub = sub;
1096 return p;
1099 /* Add a new constructor component. */
1101 static struct demangle_component *
1102 d_make_ctor (struct d_info *di, enum gnu_v3_ctor_kinds kind,
1103 struct demangle_component *name)
1105 struct demangle_component *p;
1107 p = d_make_empty (di);
1108 if (! cplus_demangle_fill_ctor (p, kind, name))
1109 return NULL;
1110 return p;
1113 /* Add a new destructor component. */
1115 static struct demangle_component *
1116 d_make_dtor (struct d_info *di, enum gnu_v3_dtor_kinds kind,
1117 struct demangle_component *name)
1119 struct demangle_component *p;
1121 p = d_make_empty (di);
1122 if (! cplus_demangle_fill_dtor (p, kind, name))
1123 return NULL;
1124 return p;
1127 /* Add a new template parameter. */
1129 static struct demangle_component *
1130 d_make_template_param (struct d_info *di, int i)
1132 struct demangle_component *p;
1134 p = d_make_empty (di);
1135 if (p != NULL)
1137 p->type = DEMANGLE_COMPONENT_TEMPLATE_PARAM;
1138 p->u.s_number.number = i;
1140 return p;
1143 /* Add a new function parameter. */
1145 static struct demangle_component *
1146 d_make_function_param (struct d_info *di, int i)
1148 struct demangle_component *p;
1150 p = d_make_empty (di);
1151 if (p != NULL)
1153 p->type = DEMANGLE_COMPONENT_FUNCTION_PARAM;
1154 p->u.s_number.number = i;
1156 return p;
1159 /* Add a new standard substitution component. */
1161 static struct demangle_component *
1162 d_make_sub (struct d_info *di, const char *name, int len)
1164 struct demangle_component *p;
1166 p = d_make_empty (di);
1167 if (p != NULL)
1169 p->type = DEMANGLE_COMPONENT_SUB_STD;
1170 p->u.s_string.string = name;
1171 p->u.s_string.len = len;
1173 return p;
1176 /* <mangled-name> ::= _Z <encoding> [<clone-suffix>]*
1178 TOP_LEVEL is non-zero when called at the top level. */
1180 CP_STATIC_IF_GLIBCPP_V3
1181 struct demangle_component *
1182 cplus_demangle_mangled_name (struct d_info *di, int top_level)
1184 struct demangle_component *p;
1186 if (! d_check_char (di, '_')
1187 /* Allow missing _ if not at toplevel to work around a
1188 bug in G++ abi-version=2 mangling; see the comment in
1189 write_template_arg. */
1190 && top_level)
1191 return NULL;
1192 if (! d_check_char (di, 'Z'))
1193 return NULL;
1194 p = d_encoding (di, top_level);
1196 /* If at top level and parsing parameters, check for a clone
1197 suffix. */
1198 if (top_level && (di->options & DMGL_PARAMS) != 0)
1199 while (d_peek_char (di) == '.'
1200 && (IS_LOWER (d_peek_next_char (di))
1201 || d_peek_next_char (di) == '_'
1202 || IS_DIGIT (d_peek_next_char (di))))
1203 p = d_clone_suffix (di, p);
1205 return p;
1208 /* Return whether a function should have a return type. The argument
1209 is the function name, which may be qualified in various ways. The
1210 rules are that template functions have return types with some
1211 exceptions, function types which are not part of a function name
1212 mangling have return types with some exceptions, and non-template
1213 function names do not have return types. The exceptions are that
1214 constructors, destructors, and conversion operators do not have
1215 return types. */
1217 static int
1218 has_return_type (struct demangle_component *dc)
1220 if (dc == NULL)
1221 return 0;
1222 switch (dc->type)
1224 default:
1225 return 0;
1226 case DEMANGLE_COMPONENT_TEMPLATE:
1227 return ! is_ctor_dtor_or_conversion (d_left (dc));
1228 case DEMANGLE_COMPONENT_RESTRICT_THIS:
1229 case DEMANGLE_COMPONENT_VOLATILE_THIS:
1230 case DEMANGLE_COMPONENT_CONST_THIS:
1231 case DEMANGLE_COMPONENT_REFERENCE_THIS:
1232 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
1233 case DEMANGLE_COMPONENT_TRANSACTION_SAFE:
1234 return has_return_type (d_left (dc));
1238 /* Return whether a name is a constructor, a destructor, or a
1239 conversion operator. */
1241 static int
1242 is_ctor_dtor_or_conversion (struct demangle_component *dc)
1244 if (dc == NULL)
1245 return 0;
1246 switch (dc->type)
1248 default:
1249 return 0;
1250 case DEMANGLE_COMPONENT_QUAL_NAME:
1251 case DEMANGLE_COMPONENT_LOCAL_NAME:
1252 return is_ctor_dtor_or_conversion (d_right (dc));
1253 case DEMANGLE_COMPONENT_CTOR:
1254 case DEMANGLE_COMPONENT_DTOR:
1255 case DEMANGLE_COMPONENT_CONVERSION:
1256 return 1;
1260 /* <encoding> ::= <(function) name> <bare-function-type>
1261 ::= <(data) name>
1262 ::= <special-name>
1264 TOP_LEVEL is non-zero when called at the top level, in which case
1265 if DMGL_PARAMS is not set we do not demangle the function
1266 parameters. We only set this at the top level, because otherwise
1267 we would not correctly demangle names in local scopes. */
1269 static struct demangle_component *
1270 d_encoding (struct d_info *di, int top_level)
1272 char peek = d_peek_char (di);
1274 if (peek == 'G' || peek == 'T')
1275 return d_special_name (di);
1276 else
1278 struct demangle_component *dc;
1280 dc = d_name (di);
1282 if (dc != NULL && top_level && (di->options & DMGL_PARAMS) == 0)
1284 /* Strip off any initial CV-qualifiers, as they really apply
1285 to the `this' parameter, and they were not output by the
1286 v2 demangler without DMGL_PARAMS. */
1287 while (dc->type == DEMANGLE_COMPONENT_RESTRICT_THIS
1288 || dc->type == DEMANGLE_COMPONENT_VOLATILE_THIS
1289 || dc->type == DEMANGLE_COMPONENT_CONST_THIS
1290 || dc->type == DEMANGLE_COMPONENT_TRANSACTION_SAFE
1291 || dc->type == DEMANGLE_COMPONENT_REFERENCE_THIS
1292 || dc->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS)
1293 dc = d_left (dc);
1295 /* If the top level is a DEMANGLE_COMPONENT_LOCAL_NAME, then
1296 there may be CV-qualifiers on its right argument which
1297 really apply here; this happens when parsing a class
1298 which is local to a function. */
1299 if (dc->type == DEMANGLE_COMPONENT_LOCAL_NAME)
1301 struct demangle_component *dcr;
1303 dcr = d_right (dc);
1304 while (dcr->type == DEMANGLE_COMPONENT_RESTRICT_THIS
1305 || dcr->type == DEMANGLE_COMPONENT_VOLATILE_THIS
1306 || dcr->type == DEMANGLE_COMPONENT_CONST_THIS
1307 || dcr->type == DEMANGLE_COMPONENT_TRANSACTION_SAFE
1308 || dcr->type == DEMANGLE_COMPONENT_REFERENCE_THIS
1309 || dcr->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS)
1310 dcr = d_left (dcr);
1311 dc->u.s_binary.right = dcr;
1314 return dc;
1317 peek = d_peek_char (di);
1318 if (dc == NULL || peek == '\0' || peek == 'E')
1319 return dc;
1320 return d_make_comp (di, DEMANGLE_COMPONENT_TYPED_NAME, dc,
1321 d_bare_function_type (di, has_return_type (dc)));
1325 /* <tagged-name> ::= <name> B <source-name> */
1327 static struct demangle_component *
1328 d_abi_tags (struct d_info *di, struct demangle_component *dc)
1330 struct demangle_component *hold_last_name;
1331 char peek;
1333 /* Preserve the last name, so the ABI tag doesn't clobber it. */
1334 hold_last_name = di->last_name;
1336 while (peek = d_peek_char (di),
1337 peek == 'B')
1339 struct demangle_component *tag;
1340 d_advance (di, 1);
1341 tag = d_source_name (di);
1342 dc = d_make_comp (di, DEMANGLE_COMPONENT_TAGGED_NAME, dc, tag);
1345 di->last_name = hold_last_name;
1347 return dc;
1350 /* <name> ::= <nested-name>
1351 ::= <unscoped-name>
1352 ::= <unscoped-template-name> <template-args>
1353 ::= <local-name>
1355 <unscoped-name> ::= <unqualified-name>
1356 ::= St <unqualified-name>
1358 <unscoped-template-name> ::= <unscoped-name>
1359 ::= <substitution>
1362 static struct demangle_component *
1363 d_name (struct d_info *di)
1365 char peek = d_peek_char (di);
1366 struct demangle_component *dc;
1368 switch (peek)
1370 case 'N':
1371 return d_nested_name (di);
1373 case 'Z':
1374 return d_local_name (di);
1376 case 'U':
1377 return d_unqualified_name (di);
1379 case 'S':
1381 int subst;
1383 if (d_peek_next_char (di) != 't')
1385 dc = d_substitution (di, 0);
1386 subst = 1;
1388 else
1390 d_advance (di, 2);
1391 dc = d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME,
1392 d_make_name (di, "std", 3),
1393 d_unqualified_name (di));
1394 di->expansion += 3;
1395 subst = 0;
1398 if (d_peek_char (di) != 'I')
1400 /* The grammar does not permit this case to occur if we
1401 called d_substitution() above (i.e., subst == 1). We
1402 don't bother to check. */
1404 else
1406 /* This is <template-args>, which means that we just saw
1407 <unscoped-template-name>, which is a substitution
1408 candidate if we didn't just get it from a
1409 substitution. */
1410 if (! subst)
1412 if (! d_add_substitution (di, dc))
1413 return NULL;
1415 dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc,
1416 d_template_args (di));
1419 return dc;
1422 case 'L':
1423 default:
1424 dc = d_unqualified_name (di);
1425 if (d_peek_char (di) == 'I')
1427 /* This is <template-args>, which means that we just saw
1428 <unscoped-template-name>, which is a substitution
1429 candidate. */
1430 if (! d_add_substitution (di, dc))
1431 return NULL;
1432 dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc,
1433 d_template_args (di));
1435 return dc;
1439 /* <nested-name> ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E
1440 ::= N [<CV-qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E
1443 static struct demangle_component *
1444 d_nested_name (struct d_info *di)
1446 struct demangle_component *ret;
1447 struct demangle_component **pret;
1448 struct demangle_component *rqual;
1450 if (! d_check_char (di, 'N'))
1451 return NULL;
1453 pret = d_cv_qualifiers (di, &ret, 1);
1454 if (pret == NULL)
1455 return NULL;
1457 /* Parse the ref-qualifier now and then attach it
1458 once we have something to attach it to. */
1459 rqual = d_ref_qualifier (di, NULL);
1461 *pret = d_prefix (di);
1462 if (*pret == NULL)
1463 return NULL;
1465 if (rqual)
1467 d_left (rqual) = ret;
1468 ret = rqual;
1471 if (! d_check_char (di, 'E'))
1472 return NULL;
1474 return ret;
1477 /* <prefix> ::= <prefix> <unqualified-name>
1478 ::= <template-prefix> <template-args>
1479 ::= <template-param>
1480 ::= <decltype>
1482 ::= <substitution>
1484 <template-prefix> ::= <prefix> <(template) unqualified-name>
1485 ::= <template-param>
1486 ::= <substitution>
1489 static struct demangle_component *
1490 d_prefix (struct d_info *di)
1492 struct demangle_component *ret = NULL;
1494 while (1)
1496 char peek;
1497 enum demangle_component_type comb_type;
1498 struct demangle_component *dc;
1500 peek = d_peek_char (di);
1501 if (peek == '\0')
1502 return NULL;
1504 /* The older code accepts a <local-name> here, but I don't see
1505 that in the grammar. The older code does not accept a
1506 <template-param> here. */
1508 comb_type = DEMANGLE_COMPONENT_QUAL_NAME;
1509 if (peek == 'D')
1511 char peek2 = d_peek_next_char (di);
1512 if (peek2 == 'T' || peek2 == 't')
1513 /* Decltype. */
1514 dc = cplus_demangle_type (di);
1515 else
1516 /* Destructor name. */
1517 dc = d_unqualified_name (di);
1519 else if (IS_DIGIT (peek)
1520 || IS_LOWER (peek)
1521 || peek == 'C'
1522 || peek == 'U'
1523 || peek == 'L')
1524 dc = d_unqualified_name (di);
1525 else if (peek == 'S')
1526 dc = d_substitution (di, 1);
1527 else if (peek == 'I')
1529 if (ret == NULL)
1530 return NULL;
1531 comb_type = DEMANGLE_COMPONENT_TEMPLATE;
1532 dc = d_template_args (di);
1534 else if (peek == 'T')
1535 dc = d_template_param (di);
1536 else if (peek == 'E')
1537 return ret;
1538 else if (peek == 'M')
1540 /* Initializer scope for a lambda. We don't need to represent
1541 this; the normal code will just treat the variable as a type
1542 scope, which gives appropriate output. */
1543 if (ret == NULL)
1544 return NULL;
1545 d_advance (di, 1);
1546 continue;
1548 else
1549 return NULL;
1551 if (ret == NULL)
1552 ret = dc;
1553 else
1554 ret = d_make_comp (di, comb_type, ret, dc);
1556 if (peek != 'S' && d_peek_char (di) != 'E')
1558 if (! d_add_substitution (di, ret))
1559 return NULL;
1564 /* <unqualified-name> ::= <operator-name>
1565 ::= <ctor-dtor-name>
1566 ::= <source-name>
1567 ::= <local-source-name>
1569 <local-source-name> ::= L <source-name> <discriminator>
1572 static struct demangle_component *
1573 d_unqualified_name (struct d_info *di)
1575 struct demangle_component *ret;
1576 char peek;
1578 peek = d_peek_char (di);
1579 if (IS_DIGIT (peek))
1580 ret = d_source_name (di);
1581 else if (IS_LOWER (peek))
1583 ret = d_operator_name (di);
1584 if (ret != NULL && ret->type == DEMANGLE_COMPONENT_OPERATOR)
1586 di->expansion += sizeof "operator" + ret->u.s_operator.op->len - 2;
1587 if (!strcmp (ret->u.s_operator.op->code, "li"))
1588 ret = d_make_comp (di, DEMANGLE_COMPONENT_UNARY, ret,
1589 d_source_name (di));
1592 else if (peek == 'C' || peek == 'D')
1593 ret = d_ctor_dtor_name (di);
1594 else if (peek == 'L')
1596 d_advance (di, 1);
1598 ret = d_source_name (di);
1599 if (ret == NULL)
1600 return NULL;
1601 if (! d_discriminator (di))
1602 return NULL;
1604 else if (peek == 'U')
1606 switch (d_peek_next_char (di))
1608 case 'l':
1609 ret = d_lambda (di);
1610 break;
1611 case 't':
1612 ret = d_unnamed_type (di);
1613 break;
1614 default:
1615 return NULL;
1618 else
1619 return NULL;
1621 if (d_peek_char (di) == 'B')
1622 ret = d_abi_tags (di, ret);
1623 return ret;
1626 /* <source-name> ::= <(positive length) number> <identifier> */
1628 static struct demangle_component *
1629 d_source_name (struct d_info *di)
1631 int len;
1632 struct demangle_component *ret;
1634 len = d_number (di);
1635 if (len <= 0)
1636 return NULL;
1637 ret = d_identifier (di, len);
1638 di->last_name = ret;
1639 return ret;
1642 /* number ::= [n] <(non-negative decimal integer)> */
1644 static int
1645 d_number (struct d_info *di)
1647 int negative;
1648 char peek;
1649 int ret;
1651 negative = 0;
1652 peek = d_peek_char (di);
1653 if (peek == 'n')
1655 negative = 1;
1656 d_advance (di, 1);
1657 peek = d_peek_char (di);
1660 ret = 0;
1661 while (1)
1663 if (! IS_DIGIT (peek))
1665 if (negative)
1666 ret = - ret;
1667 return ret;
1669 ret = ret * 10 + peek - '0';
1670 d_advance (di, 1);
1671 peek = d_peek_char (di);
1675 /* Like d_number, but returns a demangle_component. */
1677 static struct demangle_component *
1678 d_number_component (struct d_info *di)
1680 struct demangle_component *ret = d_make_empty (di);
1681 if (ret)
1683 ret->type = DEMANGLE_COMPONENT_NUMBER;
1684 ret->u.s_number.number = d_number (di);
1686 return ret;
1689 /* identifier ::= <(unqualified source code identifier)> */
1691 static struct demangle_component *
1692 d_identifier (struct d_info *di, int len)
1694 const char *name;
1696 name = d_str (di);
1698 if (di->send - name < len)
1699 return NULL;
1701 d_advance (di, len);
1703 /* A Java mangled name may have a trailing '$' if it is a C++
1704 keyword. This '$' is not included in the length count. We just
1705 ignore the '$'. */
1706 if ((di->options & DMGL_JAVA) != 0
1707 && d_peek_char (di) == '$')
1708 d_advance (di, 1);
1710 /* Look for something which looks like a gcc encoding of an
1711 anonymous namespace, and replace it with a more user friendly
1712 name. */
1713 if (len >= (int) ANONYMOUS_NAMESPACE_PREFIX_LEN + 2
1714 && memcmp (name, ANONYMOUS_NAMESPACE_PREFIX,
1715 ANONYMOUS_NAMESPACE_PREFIX_LEN) == 0)
1717 const char *s;
1719 s = name + ANONYMOUS_NAMESPACE_PREFIX_LEN;
1720 if ((*s == '.' || *s == '_' || *s == '$')
1721 && s[1] == 'N')
1723 di->expansion -= len - sizeof "(anonymous namespace)";
1724 return d_make_name (di, "(anonymous namespace)",
1725 sizeof "(anonymous namespace)" - 1);
1729 return d_make_name (di, name, len);
1732 /* operator_name ::= many different two character encodings.
1733 ::= cv <type>
1734 ::= v <digit> <source-name>
1736 This list is sorted for binary search. */
1738 #define NL(s) s, (sizeof s) - 1
1740 CP_STATIC_IF_GLIBCPP_V3
1741 const struct demangle_operator_info cplus_demangle_operators[] =
1743 { "aN", NL ("&="), 2 },
1744 { "aS", NL ("="), 2 },
1745 { "aa", NL ("&&"), 2 },
1746 { "ad", NL ("&"), 1 },
1747 { "an", NL ("&"), 2 },
1748 { "at", NL ("alignof "), 1 },
1749 { "az", NL ("alignof "), 1 },
1750 { "cc", NL ("const_cast"), 2 },
1751 { "cl", NL ("()"), 2 },
1752 { "cm", NL (","), 2 },
1753 { "co", NL ("~"), 1 },
1754 { "dV", NL ("/="), 2 },
1755 { "da", NL ("delete[] "), 1 },
1756 { "dc", NL ("dynamic_cast"), 2 },
1757 { "de", NL ("*"), 1 },
1758 { "dl", NL ("delete "), 1 },
1759 { "ds", NL (".*"), 2 },
1760 { "dt", NL ("."), 2 },
1761 { "dv", NL ("/"), 2 },
1762 { "eO", NL ("^="), 2 },
1763 { "eo", NL ("^"), 2 },
1764 { "eq", NL ("=="), 2 },
1765 { "fL", NL ("..."), 3 },
1766 { "fR", NL ("..."), 3 },
1767 { "fl", NL ("..."), 2 },
1768 { "fr", NL ("..."), 2 },
1769 { "ge", NL (">="), 2 },
1770 { "gs", NL ("::"), 1 },
1771 { "gt", NL (">"), 2 },
1772 { "ix", NL ("[]"), 2 },
1773 { "lS", NL ("<<="), 2 },
1774 { "le", NL ("<="), 2 },
1775 { "li", NL ("operator\"\" "), 1 },
1776 { "ls", NL ("<<"), 2 },
1777 { "lt", NL ("<"), 2 },
1778 { "mI", NL ("-="), 2 },
1779 { "mL", NL ("*="), 2 },
1780 { "mi", NL ("-"), 2 },
1781 { "ml", NL ("*"), 2 },
1782 { "mm", NL ("--"), 1 },
1783 { "na", NL ("new[]"), 3 },
1784 { "ne", NL ("!="), 2 },
1785 { "ng", NL ("-"), 1 },
1786 { "nt", NL ("!"), 1 },
1787 { "nw", NL ("new"), 3 },
1788 { "oR", NL ("|="), 2 },
1789 { "oo", NL ("||"), 2 },
1790 { "or", NL ("|"), 2 },
1791 { "pL", NL ("+="), 2 },
1792 { "pl", NL ("+"), 2 },
1793 { "pm", NL ("->*"), 2 },
1794 { "pp", NL ("++"), 1 },
1795 { "ps", NL ("+"), 1 },
1796 { "pt", NL ("->"), 2 },
1797 { "qu", NL ("?"), 3 },
1798 { "rM", NL ("%="), 2 },
1799 { "rS", NL (">>="), 2 },
1800 { "rc", NL ("reinterpret_cast"), 2 },
1801 { "rm", NL ("%"), 2 },
1802 { "rs", NL (">>"), 2 },
1803 { "sP", NL ("sizeof..."), 1 },
1804 { "sZ", NL ("sizeof..."), 1 },
1805 { "sc", NL ("static_cast"), 2 },
1806 { "st", NL ("sizeof "), 1 },
1807 { "sz", NL ("sizeof "), 1 },
1808 { "tr", NL ("throw"), 0 },
1809 { "tw", NL ("throw "), 1 },
1810 { NULL, NULL, 0, 0 }
1813 static struct demangle_component *
1814 d_operator_name (struct d_info *di)
1816 char c1;
1817 char c2;
1819 c1 = d_next_char (di);
1820 c2 = d_next_char (di);
1821 if (c1 == 'v' && IS_DIGIT (c2))
1822 return d_make_extended_operator (di, c2 - '0', d_source_name (di));
1823 else if (c1 == 'c' && c2 == 'v')
1825 struct demangle_component *type;
1826 int was_conversion = di->is_conversion;
1827 struct demangle_component *res;
1829 di->is_conversion = ! di->is_expression;
1830 type = cplus_demangle_type (di);
1831 if (di->is_conversion)
1832 res = d_make_comp (di, DEMANGLE_COMPONENT_CONVERSION, type, NULL);
1833 else
1834 res = d_make_comp (di, DEMANGLE_COMPONENT_CAST, type, NULL);
1835 di->is_conversion = was_conversion;
1836 return res;
1838 else
1840 /* LOW is the inclusive lower bound. */
1841 int low = 0;
1842 /* HIGH is the exclusive upper bound. We subtract one to ignore
1843 the sentinel at the end of the array. */
1844 int high = ((sizeof (cplus_demangle_operators)
1845 / sizeof (cplus_demangle_operators[0]))
1846 - 1);
1848 while (1)
1850 int i;
1851 const struct demangle_operator_info *p;
1853 i = low + (high - low) / 2;
1854 p = cplus_demangle_operators + i;
1856 if (c1 == p->code[0] && c2 == p->code[1])
1857 return d_make_operator (di, p);
1859 if (c1 < p->code[0] || (c1 == p->code[0] && c2 < p->code[1]))
1860 high = i;
1861 else
1862 low = i + 1;
1863 if (low == high)
1864 return NULL;
1869 static struct demangle_component *
1870 d_make_character (struct d_info *di, int c)
1872 struct demangle_component *p;
1873 p = d_make_empty (di);
1874 if (p != NULL)
1876 p->type = DEMANGLE_COMPONENT_CHARACTER;
1877 p->u.s_character.character = c;
1879 return p;
1882 static struct demangle_component *
1883 d_java_resource (struct d_info *di)
1885 struct demangle_component *p = NULL;
1886 struct demangle_component *next = NULL;
1887 int len, i;
1888 char c;
1889 const char *str;
1891 len = d_number (di);
1892 if (len <= 1)
1893 return NULL;
1895 /* Eat the leading '_'. */
1896 if (d_next_char (di) != '_')
1897 return NULL;
1898 len--;
1900 str = d_str (di);
1901 i = 0;
1903 while (len > 0)
1905 c = str[i];
1906 if (!c)
1907 return NULL;
1909 /* Each chunk is either a '$' escape... */
1910 if (c == '$')
1912 i++;
1913 switch (str[i++])
1915 case 'S':
1916 c = '/';
1917 break;
1918 case '_':
1919 c = '.';
1920 break;
1921 case '$':
1922 c = '$';
1923 break;
1924 default:
1925 return NULL;
1927 next = d_make_character (di, c);
1928 d_advance (di, i);
1929 str = d_str (di);
1930 len -= i;
1931 i = 0;
1932 if (next == NULL)
1933 return NULL;
1935 /* ... or a sequence of characters. */
1936 else
1938 while (i < len && str[i] && str[i] != '$')
1939 i++;
1941 next = d_make_name (di, str, i);
1942 d_advance (di, i);
1943 str = d_str (di);
1944 len -= i;
1945 i = 0;
1946 if (next == NULL)
1947 return NULL;
1950 if (p == NULL)
1951 p = next;
1952 else
1954 p = d_make_comp (di, DEMANGLE_COMPONENT_COMPOUND_NAME, p, next);
1955 if (p == NULL)
1956 return NULL;
1960 p = d_make_comp (di, DEMANGLE_COMPONENT_JAVA_RESOURCE, p, NULL);
1962 return p;
1965 /* <special-name> ::= TV <type>
1966 ::= TT <type>
1967 ::= TI <type>
1968 ::= TS <type>
1969 ::= GV <(object) name>
1970 ::= T <call-offset> <(base) encoding>
1971 ::= Tc <call-offset> <call-offset> <(base) encoding>
1972 Also g++ extensions:
1973 ::= TC <type> <(offset) number> _ <(base) type>
1974 ::= TF <type>
1975 ::= TJ <type>
1976 ::= GR <name>
1977 ::= GA <encoding>
1978 ::= Gr <resource name>
1979 ::= GTt <encoding>
1980 ::= GTn <encoding>
1983 static struct demangle_component *
1984 d_special_name (struct d_info *di)
1986 di->expansion += 20;
1987 if (d_check_char (di, 'T'))
1989 switch (d_next_char (di))
1991 case 'V':
1992 di->expansion -= 5;
1993 return d_make_comp (di, DEMANGLE_COMPONENT_VTABLE,
1994 cplus_demangle_type (di), NULL);
1995 case 'T':
1996 di->expansion -= 10;
1997 return d_make_comp (di, DEMANGLE_COMPONENT_VTT,
1998 cplus_demangle_type (di), NULL);
1999 case 'I':
2000 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO,
2001 cplus_demangle_type (di), NULL);
2002 case 'S':
2003 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_NAME,
2004 cplus_demangle_type (di), NULL);
2006 case 'h':
2007 if (! d_call_offset (di, 'h'))
2008 return NULL;
2009 return d_make_comp (di, DEMANGLE_COMPONENT_THUNK,
2010 d_encoding (di, 0), NULL);
2012 case 'v':
2013 if (! d_call_offset (di, 'v'))
2014 return NULL;
2015 return d_make_comp (di, DEMANGLE_COMPONENT_VIRTUAL_THUNK,
2016 d_encoding (di, 0), NULL);
2018 case 'c':
2019 if (! d_call_offset (di, '\0'))
2020 return NULL;
2021 if (! d_call_offset (di, '\0'))
2022 return NULL;
2023 return d_make_comp (di, DEMANGLE_COMPONENT_COVARIANT_THUNK,
2024 d_encoding (di, 0), NULL);
2026 case 'C':
2028 struct demangle_component *derived_type;
2029 int offset;
2030 struct demangle_component *base_type;
2032 derived_type = cplus_demangle_type (di);
2033 offset = d_number (di);
2034 if (offset < 0)
2035 return NULL;
2036 if (! d_check_char (di, '_'))
2037 return NULL;
2038 base_type = cplus_demangle_type (di);
2039 /* We don't display the offset. FIXME: We should display
2040 it in verbose mode. */
2041 di->expansion += 5;
2042 return d_make_comp (di, DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE,
2043 base_type, derived_type);
2046 case 'F':
2047 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_FN,
2048 cplus_demangle_type (di), NULL);
2049 case 'J':
2050 return d_make_comp (di, DEMANGLE_COMPONENT_JAVA_CLASS,
2051 cplus_demangle_type (di), NULL);
2053 case 'H':
2054 return d_make_comp (di, DEMANGLE_COMPONENT_TLS_INIT,
2055 d_name (di), NULL);
2057 case 'W':
2058 return d_make_comp (di, DEMANGLE_COMPONENT_TLS_WRAPPER,
2059 d_name (di), NULL);
2061 default:
2062 return NULL;
2065 else if (d_check_char (di, 'G'))
2067 switch (d_next_char (di))
2069 case 'V':
2070 return d_make_comp (di, DEMANGLE_COMPONENT_GUARD, d_name (di), NULL);
2072 case 'R':
2074 struct demangle_component *name = d_name (di);
2075 return d_make_comp (di, DEMANGLE_COMPONENT_REFTEMP, name,
2076 d_number_component (di));
2079 case 'A':
2080 return d_make_comp (di, DEMANGLE_COMPONENT_HIDDEN_ALIAS,
2081 d_encoding (di, 0), NULL);
2083 case 'T':
2084 switch (d_next_char (di))
2086 case 'n':
2087 return d_make_comp (di, DEMANGLE_COMPONENT_NONTRANSACTION_CLONE,
2088 d_encoding (di, 0), NULL);
2089 default:
2090 /* ??? The proposal is that other letters (such as 'h') stand
2091 for different variants of transaction cloning, such as
2092 compiling directly for hardware transaction support. But
2093 they still should all be transactional clones of some sort
2094 so go ahead and call them that. */
2095 case 't':
2096 return d_make_comp (di, DEMANGLE_COMPONENT_TRANSACTION_CLONE,
2097 d_encoding (di, 0), NULL);
2100 case 'r':
2101 return d_java_resource (di);
2103 default:
2104 return NULL;
2107 else
2108 return NULL;
2111 /* <call-offset> ::= h <nv-offset> _
2112 ::= v <v-offset> _
2114 <nv-offset> ::= <(offset) number>
2116 <v-offset> ::= <(offset) number> _ <(virtual offset) number>
2118 The C parameter, if not '\0', is a character we just read which is
2119 the start of the <call-offset>.
2121 We don't display the offset information anywhere. FIXME: We should
2122 display it in verbose mode. */
2124 static int
2125 d_call_offset (struct d_info *di, int c)
2127 if (c == '\0')
2128 c = d_next_char (di);
2130 if (c == 'h')
2131 d_number (di);
2132 else if (c == 'v')
2134 d_number (di);
2135 if (! d_check_char (di, '_'))
2136 return 0;
2137 d_number (di);
2139 else
2140 return 0;
2142 if (! d_check_char (di, '_'))
2143 return 0;
2145 return 1;
2148 /* <ctor-dtor-name> ::= C1
2149 ::= C2
2150 ::= C3
2151 ::= D0
2152 ::= D1
2153 ::= D2
2156 static struct demangle_component *
2157 d_ctor_dtor_name (struct d_info *di)
2159 if (di->last_name != NULL)
2161 if (di->last_name->type == DEMANGLE_COMPONENT_NAME)
2162 di->expansion += di->last_name->u.s_name.len;
2163 else if (di->last_name->type == DEMANGLE_COMPONENT_SUB_STD)
2164 di->expansion += di->last_name->u.s_string.len;
2166 switch (d_peek_char (di))
2168 case 'C':
2170 enum gnu_v3_ctor_kinds kind;
2172 switch (d_peek_next_char (di))
2174 case '1':
2175 kind = gnu_v3_complete_object_ctor;
2176 break;
2177 case '2':
2178 kind = gnu_v3_base_object_ctor;
2179 break;
2180 case '3':
2181 kind = gnu_v3_complete_object_allocating_ctor;
2182 break;
2183 case '4':
2184 kind = gnu_v3_unified_ctor;
2185 break;
2186 case '5':
2187 kind = gnu_v3_object_ctor_group;
2188 break;
2189 default:
2190 return NULL;
2192 d_advance (di, 2);
2193 return d_make_ctor (di, kind, di->last_name);
2196 case 'D':
2198 enum gnu_v3_dtor_kinds kind;
2200 switch (d_peek_next_char (di))
2202 case '0':
2203 kind = gnu_v3_deleting_dtor;
2204 break;
2205 case '1':
2206 kind = gnu_v3_complete_object_dtor;
2207 break;
2208 case '2':
2209 kind = gnu_v3_base_object_dtor;
2210 break;
2211 /* digit '3' is not used */
2212 case '4':
2213 kind = gnu_v3_unified_dtor;
2214 break;
2215 case '5':
2216 kind = gnu_v3_object_dtor_group;
2217 break;
2218 default:
2219 return NULL;
2221 d_advance (di, 2);
2222 return d_make_dtor (di, kind, di->last_name);
2225 default:
2226 return NULL;
2230 /* <type> ::= <builtin-type>
2231 ::= <function-type>
2232 ::= <class-enum-type>
2233 ::= <array-type>
2234 ::= <pointer-to-member-type>
2235 ::= <template-param>
2236 ::= <template-template-param> <template-args>
2237 ::= <substitution>
2238 ::= <CV-qualifiers> <type>
2239 ::= P <type>
2240 ::= R <type>
2241 ::= O <type> (C++0x)
2242 ::= C <type>
2243 ::= G <type>
2244 ::= U <source-name> <type>
2246 <builtin-type> ::= various one letter codes
2247 ::= u <source-name>
2250 CP_STATIC_IF_GLIBCPP_V3
2251 const struct demangle_builtin_type_info
2252 cplus_demangle_builtin_types[D_BUILTIN_TYPE_COUNT] =
2254 /* a */ { NL ("signed char"), NL ("signed char"), D_PRINT_DEFAULT },
2255 /* b */ { NL ("bool"), NL ("boolean"), D_PRINT_BOOL },
2256 /* c */ { NL ("char"), NL ("byte"), D_PRINT_DEFAULT },
2257 /* d */ { NL ("double"), NL ("double"), D_PRINT_FLOAT },
2258 /* e */ { NL ("long double"), NL ("long double"), D_PRINT_FLOAT },
2259 /* f */ { NL ("float"), NL ("float"), D_PRINT_FLOAT },
2260 /* g */ { NL ("__float128"), NL ("__float128"), D_PRINT_FLOAT },
2261 /* h */ { NL ("unsigned char"), NL ("unsigned char"), D_PRINT_DEFAULT },
2262 /* i */ { NL ("int"), NL ("int"), D_PRINT_INT },
2263 /* j */ { NL ("unsigned int"), NL ("unsigned"), D_PRINT_UNSIGNED },
2264 /* k */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2265 /* l */ { NL ("long"), NL ("long"), D_PRINT_LONG },
2266 /* m */ { NL ("unsigned long"), NL ("unsigned long"), D_PRINT_UNSIGNED_LONG },
2267 /* n */ { NL ("__int128"), NL ("__int128"), D_PRINT_DEFAULT },
2268 /* o */ { NL ("unsigned __int128"), NL ("unsigned __int128"),
2269 D_PRINT_DEFAULT },
2270 /* p */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2271 /* q */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2272 /* r */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2273 /* s */ { NL ("short"), NL ("short"), D_PRINT_DEFAULT },
2274 /* t */ { NL ("unsigned short"), NL ("unsigned short"), D_PRINT_DEFAULT },
2275 /* u */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2276 /* v */ { NL ("void"), NL ("void"), D_PRINT_VOID },
2277 /* w */ { NL ("wchar_t"), NL ("char"), D_PRINT_DEFAULT },
2278 /* x */ { NL ("long long"), NL ("long"), D_PRINT_LONG_LONG },
2279 /* y */ { NL ("unsigned long long"), NL ("unsigned long long"),
2280 D_PRINT_UNSIGNED_LONG_LONG },
2281 /* z */ { NL ("..."), NL ("..."), D_PRINT_DEFAULT },
2282 /* 26 */ { NL ("decimal32"), NL ("decimal32"), D_PRINT_DEFAULT },
2283 /* 27 */ { NL ("decimal64"), NL ("decimal64"), D_PRINT_DEFAULT },
2284 /* 28 */ { NL ("decimal128"), NL ("decimal128"), D_PRINT_DEFAULT },
2285 /* 29 */ { NL ("half"), NL ("half"), D_PRINT_FLOAT },
2286 /* 30 */ { NL ("char16_t"), NL ("char16_t"), D_PRINT_DEFAULT },
2287 /* 31 */ { NL ("char32_t"), NL ("char32_t"), D_PRINT_DEFAULT },
2288 /* 32 */ { NL ("decltype(nullptr)"), NL ("decltype(nullptr)"),
2289 D_PRINT_DEFAULT },
2292 CP_STATIC_IF_GLIBCPP_V3
2293 struct demangle_component *
2294 cplus_demangle_type (struct d_info *di)
2296 char peek;
2297 struct demangle_component *ret;
2298 int can_subst;
2300 /* The ABI specifies that when CV-qualifiers are used, the base type
2301 is substitutable, and the fully qualified type is substitutable,
2302 but the base type with a strict subset of the CV-qualifiers is
2303 not substitutable. The natural recursive implementation of the
2304 CV-qualifiers would cause subsets to be substitutable, so instead
2305 we pull them all off now.
2307 FIXME: The ABI says that order-insensitive vendor qualifiers
2308 should be handled in the same way, but we have no way to tell
2309 which vendor qualifiers are order-insensitive and which are
2310 order-sensitive. So we just assume that they are all
2311 order-sensitive. g++ 3.4 supports only one vendor qualifier,
2312 __vector, and it treats it as order-sensitive when mangling
2313 names. */
2315 peek = d_peek_char (di);
2316 if (peek == 'r' || peek == 'V' || peek == 'K'
2317 || (peek == 'D' && d_peek_next_char (di) == 'x'))
2319 struct demangle_component **pret;
2321 pret = d_cv_qualifiers (di, &ret, 0);
2322 if (pret == NULL)
2323 return NULL;
2324 if (d_peek_char (di) == 'F')
2326 /* cv-qualifiers before a function type apply to 'this',
2327 so avoid adding the unqualified function type to
2328 the substitution list. */
2329 *pret = d_function_type (di);
2331 else
2332 *pret = cplus_demangle_type (di);
2333 if (!*pret)
2334 return NULL;
2335 if ((*pret)->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
2336 || (*pret)->type == DEMANGLE_COMPONENT_REFERENCE_THIS)
2338 /* Move the ref-qualifier outside the cv-qualifiers so that
2339 they are printed in the right order. */
2340 struct demangle_component *fn = d_left (*pret);
2341 d_left (*pret) = ret;
2342 ret = *pret;
2343 *pret = fn;
2345 if (! d_add_substitution (di, ret))
2346 return NULL;
2347 return ret;
2350 can_subst = 1;
2352 switch (peek)
2354 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
2355 case 'h': case 'i': case 'j': case 'l': case 'm': case 'n':
2356 case 'o': case 's': case 't':
2357 case 'v': case 'w': case 'x': case 'y': case 'z':
2358 ret = d_make_builtin_type (di,
2359 &cplus_demangle_builtin_types[peek - 'a']);
2360 di->expansion += ret->u.s_builtin.type->len;
2361 can_subst = 0;
2362 d_advance (di, 1);
2363 break;
2365 case 'u':
2366 d_advance (di, 1);
2367 ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE,
2368 d_source_name (di), NULL);
2369 break;
2371 case 'F':
2372 ret = d_function_type (di);
2373 break;
2375 case '0': case '1': case '2': case '3': case '4':
2376 case '5': case '6': case '7': case '8': case '9':
2377 case 'N':
2378 case 'Z':
2379 ret = d_class_enum_type (di);
2380 break;
2382 case 'A':
2383 ret = d_array_type (di);
2384 break;
2386 case 'M':
2387 ret = d_pointer_to_member_type (di);
2388 break;
2390 case 'T':
2391 ret = d_template_param (di);
2392 if (d_peek_char (di) == 'I')
2394 /* This may be <template-template-param> <template-args>.
2395 If this is the type for a conversion operator, we can
2396 have a <template-template-param> here only by following
2397 a derivation like this:
2399 <nested-name>
2400 -> <template-prefix> <template-args>
2401 -> <prefix> <template-unqualified-name> <template-args>
2402 -> <unqualified-name> <template-unqualified-name> <template-args>
2403 -> <source-name> <template-unqualified-name> <template-args>
2404 -> <source-name> <operator-name> <template-args>
2405 -> <source-name> cv <type> <template-args>
2406 -> <source-name> cv <template-template-param> <template-args> <template-args>
2408 where the <template-args> is followed by another.
2409 Otherwise, we must have a derivation like this:
2411 <nested-name>
2412 -> <template-prefix> <template-args>
2413 -> <prefix> <template-unqualified-name> <template-args>
2414 -> <unqualified-name> <template-unqualified-name> <template-args>
2415 -> <source-name> <template-unqualified-name> <template-args>
2416 -> <source-name> <operator-name> <template-args>
2417 -> <source-name> cv <type> <template-args>
2418 -> <source-name> cv <template-param> <template-args>
2420 where we need to leave the <template-args> to be processed
2421 by d_prefix (following the <template-prefix>).
2423 The <template-template-param> part is a substitution
2424 candidate. */
2425 if (! di->is_conversion)
2427 if (! d_add_substitution (di, ret))
2428 return NULL;
2429 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2430 d_template_args (di));
2432 else
2434 struct demangle_component *args;
2435 struct d_info_checkpoint checkpoint;
2437 d_checkpoint (di, &checkpoint);
2438 args = d_template_args (di);
2439 if (d_peek_char (di) == 'I')
2441 if (! d_add_substitution (di, ret))
2442 return NULL;
2443 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2444 args);
2446 else
2447 d_backtrack (di, &checkpoint);
2450 break;
2452 case 'S':
2453 /* If this is a special substitution, then it is the start of
2454 <class-enum-type>. */
2456 char peek_next;
2458 peek_next = d_peek_next_char (di);
2459 if (IS_DIGIT (peek_next)
2460 || peek_next == '_'
2461 || IS_UPPER (peek_next))
2463 ret = d_substitution (di, 0);
2464 /* The substituted name may have been a template name and
2465 may be followed by tepmlate args. */
2466 if (d_peek_char (di) == 'I')
2467 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2468 d_template_args (di));
2469 else
2470 can_subst = 0;
2472 else
2474 ret = d_class_enum_type (di);
2475 /* If the substitution was a complete type, then it is not
2476 a new substitution candidate. However, if the
2477 substitution was followed by template arguments, then
2478 the whole thing is a substitution candidate. */
2479 if (ret != NULL && ret->type == DEMANGLE_COMPONENT_SUB_STD)
2480 can_subst = 0;
2483 break;
2485 case 'O':
2486 d_advance (di, 1);
2487 ret = d_make_comp (di, DEMANGLE_COMPONENT_RVALUE_REFERENCE,
2488 cplus_demangle_type (di), NULL);
2489 break;
2491 case 'P':
2492 d_advance (di, 1);
2493 ret = d_make_comp (di, DEMANGLE_COMPONENT_POINTER,
2494 cplus_demangle_type (di), NULL);
2495 break;
2497 case 'R':
2498 d_advance (di, 1);
2499 ret = d_make_comp (di, DEMANGLE_COMPONENT_REFERENCE,
2500 cplus_demangle_type (di), NULL);
2501 break;
2503 case 'C':
2504 d_advance (di, 1);
2505 ret = d_make_comp (di, DEMANGLE_COMPONENT_COMPLEX,
2506 cplus_demangle_type (di), NULL);
2507 break;
2509 case 'G':
2510 d_advance (di, 1);
2511 ret = d_make_comp (di, DEMANGLE_COMPONENT_IMAGINARY,
2512 cplus_demangle_type (di), NULL);
2513 break;
2515 case 'U':
2516 d_advance (di, 1);
2517 ret = d_source_name (di);
2518 if (d_peek_char (di) == 'I')
2519 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2520 d_template_args (di));
2521 ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL,
2522 cplus_demangle_type (di), ret);
2523 break;
2525 case 'D':
2526 can_subst = 0;
2527 d_advance (di, 1);
2528 peek = d_next_char (di);
2529 switch (peek)
2531 case 'T':
2532 case 't':
2533 /* decltype (expression) */
2534 ret = d_make_comp (di, DEMANGLE_COMPONENT_DECLTYPE,
2535 d_expression (di), NULL);
2536 if (ret && d_next_char (di) != 'E')
2537 ret = NULL;
2538 can_subst = 1;
2539 break;
2541 case 'p':
2542 /* Pack expansion. */
2543 ret = d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION,
2544 cplus_demangle_type (di), NULL);
2545 can_subst = 1;
2546 break;
2548 case 'a':
2549 /* auto */
2550 ret = d_make_name (di, "auto", 4);
2551 break;
2553 case 'f':
2554 /* 32-bit decimal floating point */
2555 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[26]);
2556 di->expansion += ret->u.s_builtin.type->len;
2557 break;
2558 case 'd':
2559 /* 64-bit DFP */
2560 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[27]);
2561 di->expansion += ret->u.s_builtin.type->len;
2562 break;
2563 case 'e':
2564 /* 128-bit DFP */
2565 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[28]);
2566 di->expansion += ret->u.s_builtin.type->len;
2567 break;
2568 case 'h':
2569 /* 16-bit half-precision FP */
2570 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[29]);
2571 di->expansion += ret->u.s_builtin.type->len;
2572 break;
2573 case 's':
2574 /* char16_t */
2575 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[30]);
2576 di->expansion += ret->u.s_builtin.type->len;
2577 break;
2578 case 'i':
2579 /* char32_t */
2580 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[31]);
2581 di->expansion += ret->u.s_builtin.type->len;
2582 break;
2584 case 'F':
2585 /* Fixed point types. DF<int bits><length><fract bits><sat> */
2586 ret = d_make_empty (di);
2587 ret->type = DEMANGLE_COMPONENT_FIXED_TYPE;
2588 if ((ret->u.s_fixed.accum = IS_DIGIT (d_peek_char (di))))
2589 /* For demangling we don't care about the bits. */
2590 d_number (di);
2591 ret->u.s_fixed.length = cplus_demangle_type (di);
2592 if (ret->u.s_fixed.length == NULL)
2593 return NULL;
2594 d_number (di);
2595 peek = d_next_char (di);
2596 ret->u.s_fixed.sat = (peek == 's');
2597 break;
2599 case 'v':
2600 ret = d_vector_type (di);
2601 can_subst = 1;
2602 break;
2604 case 'n':
2605 /* decltype(nullptr) */
2606 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[32]);
2607 di->expansion += ret->u.s_builtin.type->len;
2608 break;
2610 default:
2611 return NULL;
2613 break;
2615 default:
2616 return NULL;
2619 if (can_subst)
2621 if (! d_add_substitution (di, ret))
2622 return NULL;
2625 return ret;
2628 /* <CV-qualifiers> ::= [r] [V] [K] [Dx] */
2630 static struct demangle_component **
2631 d_cv_qualifiers (struct d_info *di,
2632 struct demangle_component **pret, int member_fn)
2634 struct demangle_component **pstart;
2635 char peek;
2637 pstart = pret;
2638 peek = d_peek_char (di);
2639 while (peek == 'r' || peek == 'V' || peek == 'K'
2640 || (peek == 'D' && d_peek_next_char (di) == 'x'))
2642 enum demangle_component_type t;
2644 d_advance (di, 1);
2645 if (peek == 'r')
2647 t = (member_fn
2648 ? DEMANGLE_COMPONENT_RESTRICT_THIS
2649 : DEMANGLE_COMPONENT_RESTRICT);
2650 di->expansion += sizeof "restrict";
2652 else if (peek == 'V')
2654 t = (member_fn
2655 ? DEMANGLE_COMPONENT_VOLATILE_THIS
2656 : DEMANGLE_COMPONENT_VOLATILE);
2657 di->expansion += sizeof "volatile";
2659 else if (peek == 'K')
2661 t = (member_fn
2662 ? DEMANGLE_COMPONENT_CONST_THIS
2663 : DEMANGLE_COMPONENT_CONST);
2664 di->expansion += sizeof "const";
2666 else
2668 t = DEMANGLE_COMPONENT_TRANSACTION_SAFE;
2669 di->expansion += sizeof "transaction_safe";
2670 d_advance (di, 1);
2673 *pret = d_make_comp (di, t, NULL, NULL);
2674 if (*pret == NULL)
2675 return NULL;
2676 pret = &d_left (*pret);
2678 peek = d_peek_char (di);
2681 if (!member_fn && peek == 'F')
2683 while (pstart != pret)
2685 switch ((*pstart)->type)
2687 case DEMANGLE_COMPONENT_RESTRICT:
2688 (*pstart)->type = DEMANGLE_COMPONENT_RESTRICT_THIS;
2689 break;
2690 case DEMANGLE_COMPONENT_VOLATILE:
2691 (*pstart)->type = DEMANGLE_COMPONENT_VOLATILE_THIS;
2692 break;
2693 case DEMANGLE_COMPONENT_CONST:
2694 (*pstart)->type = DEMANGLE_COMPONENT_CONST_THIS;
2695 break;
2696 default:
2697 break;
2699 pstart = &d_left (*pstart);
2703 return pret;
2706 /* <ref-qualifier> ::= R
2707 ::= O */
2709 static struct demangle_component *
2710 d_ref_qualifier (struct d_info *di, struct demangle_component *sub)
2712 struct demangle_component *ret = sub;
2713 char peek;
2715 peek = d_peek_char (di);
2716 if (peek == 'R' || peek == 'O')
2718 enum demangle_component_type t;
2719 if (peek == 'R')
2721 t = DEMANGLE_COMPONENT_REFERENCE_THIS;
2722 di->expansion += sizeof "&";
2724 else
2726 t = DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS;
2727 di->expansion += sizeof "&&";
2729 d_advance (di, 1);
2731 ret = d_make_comp (di, t, ret, NULL);
2734 return ret;
2737 /* <function-type> ::= F [Y] <bare-function-type> [<ref-qualifier>] [T] E */
2739 static struct demangle_component *
2740 d_function_type (struct d_info *di)
2742 struct demangle_component *ret;
2744 if (! d_check_char (di, 'F'))
2745 return NULL;
2746 if (d_peek_char (di) == 'Y')
2748 /* Function has C linkage. We don't print this information.
2749 FIXME: We should print it in verbose mode. */
2750 d_advance (di, 1);
2752 ret = d_bare_function_type (di, 1);
2753 ret = d_ref_qualifier (di, ret);
2755 if (! d_check_char (di, 'E'))
2756 return NULL;
2757 return ret;
2760 /* <type>+ */
2762 static struct demangle_component *
2763 d_parmlist (struct d_info *di)
2765 struct demangle_component *tl;
2766 struct demangle_component **ptl;
2768 tl = NULL;
2769 ptl = &tl;
2770 while (1)
2772 struct demangle_component *type;
2774 char peek = d_peek_char (di);
2775 if (peek == '\0' || peek == 'E' || peek == '.')
2776 break;
2777 if ((peek == 'R' || peek == 'O')
2778 && d_peek_next_char (di) == 'E')
2779 /* Function ref-qualifier, not a ref prefix for a parameter type. */
2780 break;
2781 type = cplus_demangle_type (di);
2782 if (type == NULL)
2783 return NULL;
2784 *ptl = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, type, NULL);
2785 if (*ptl == NULL)
2786 return NULL;
2787 ptl = &d_right (*ptl);
2790 /* There should be at least one parameter type besides the optional
2791 return type. A function which takes no arguments will have a
2792 single parameter type void. */
2793 if (tl == NULL)
2794 return NULL;
2796 /* If we have a single parameter type void, omit it. */
2797 if (d_right (tl) == NULL
2798 && d_left (tl)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
2799 && d_left (tl)->u.s_builtin.type->print == D_PRINT_VOID)
2801 di->expansion -= d_left (tl)->u.s_builtin.type->len;
2802 d_left (tl) = NULL;
2805 return tl;
2808 /* <bare-function-type> ::= [J]<type>+ */
2810 static struct demangle_component *
2811 d_bare_function_type (struct d_info *di, int has_return_type)
2813 struct demangle_component *return_type;
2814 struct demangle_component *tl;
2815 char peek;
2817 /* Detect special qualifier indicating that the first argument
2818 is the return type. */
2819 peek = d_peek_char (di);
2820 if (peek == 'J')
2822 d_advance (di, 1);
2823 has_return_type = 1;
2826 if (has_return_type)
2828 return_type = cplus_demangle_type (di);
2829 if (return_type == NULL)
2830 return NULL;
2832 else
2833 return_type = NULL;
2835 tl = d_parmlist (di);
2836 if (tl == NULL)
2837 return NULL;
2839 return d_make_comp (di, DEMANGLE_COMPONENT_FUNCTION_TYPE,
2840 return_type, tl);
2843 /* <class-enum-type> ::= <name> */
2845 static struct demangle_component *
2846 d_class_enum_type (struct d_info *di)
2848 return d_name (di);
2851 /* <array-type> ::= A <(positive dimension) number> _ <(element) type>
2852 ::= A [<(dimension) expression>] _ <(element) type>
2855 static struct demangle_component *
2856 d_array_type (struct d_info *di)
2858 char peek;
2859 struct demangle_component *dim;
2861 if (! d_check_char (di, 'A'))
2862 return NULL;
2864 peek = d_peek_char (di);
2865 if (peek == '_')
2866 dim = NULL;
2867 else if (IS_DIGIT (peek))
2869 const char *s;
2871 s = d_str (di);
2874 d_advance (di, 1);
2875 peek = d_peek_char (di);
2877 while (IS_DIGIT (peek));
2878 dim = d_make_name (di, s, d_str (di) - s);
2879 if (dim == NULL)
2880 return NULL;
2882 else
2884 dim = d_expression (di);
2885 if (dim == NULL)
2886 return NULL;
2889 if (! d_check_char (di, '_'))
2890 return NULL;
2892 return d_make_comp (di, DEMANGLE_COMPONENT_ARRAY_TYPE, dim,
2893 cplus_demangle_type (di));
2896 /* <vector-type> ::= Dv <number> _ <type>
2897 ::= Dv _ <expression> _ <type> */
2899 static struct demangle_component *
2900 d_vector_type (struct d_info *di)
2902 char peek;
2903 struct demangle_component *dim;
2905 peek = d_peek_char (di);
2906 if (peek == '_')
2908 d_advance (di, 1);
2909 dim = d_expression (di);
2911 else
2912 dim = d_number_component (di);
2914 if (dim == NULL)
2915 return NULL;
2917 if (! d_check_char (di, '_'))
2918 return NULL;
2920 return d_make_comp (di, DEMANGLE_COMPONENT_VECTOR_TYPE, dim,
2921 cplus_demangle_type (di));
2924 /* <pointer-to-member-type> ::= M <(class) type> <(member) type> */
2926 static struct demangle_component *
2927 d_pointer_to_member_type (struct d_info *di)
2929 struct demangle_component *cl;
2930 struct demangle_component *mem;
2932 if (! d_check_char (di, 'M'))
2933 return NULL;
2935 cl = cplus_demangle_type (di);
2936 if (cl == NULL)
2937 return NULL;
2939 /* The ABI says, "The type of a non-static member function is considered
2940 to be different, for the purposes of substitution, from the type of a
2941 namespace-scope or static member function whose type appears
2942 similar. The types of two non-static member functions are considered
2943 to be different, for the purposes of substitution, if the functions
2944 are members of different classes. In other words, for the purposes of
2945 substitution, the class of which the function is a member is
2946 considered part of the type of function."
2948 For a pointer to member function, this call to cplus_demangle_type
2949 will end up adding a (possibly qualified) non-member function type to
2950 the substitution table, which is not correct; however, the member
2951 function type will never be used in a substitution, so putting the
2952 wrong type in the substitution table is harmless. */
2954 mem = cplus_demangle_type (di);
2955 if (mem == NULL)
2956 return NULL;
2958 return d_make_comp (di, DEMANGLE_COMPONENT_PTRMEM_TYPE, cl, mem);
2961 /* <non-negative number> _ */
2963 static int
2964 d_compact_number (struct d_info *di)
2966 int num;
2967 if (d_peek_char (di) == '_')
2968 num = 0;
2969 else if (d_peek_char (di) == 'n')
2970 return -1;
2971 else
2972 num = d_number (di) + 1;
2974 if (num < 0 || ! d_check_char (di, '_'))
2975 return -1;
2976 return num;
2979 /* <template-param> ::= T_
2980 ::= T <(parameter-2 non-negative) number> _
2983 static struct demangle_component *
2984 d_template_param (struct d_info *di)
2986 int param;
2988 if (! d_check_char (di, 'T'))
2989 return NULL;
2991 param = d_compact_number (di);
2992 if (param < 0)
2993 return NULL;
2995 ++di->did_subs;
2997 return d_make_template_param (di, param);
3000 /* <template-args> ::= I <template-arg>+ E */
3002 static struct demangle_component *
3003 d_template_args (struct d_info *di)
3005 if (d_peek_char (di) != 'I'
3006 && d_peek_char (di) != 'J')
3007 return NULL;
3008 d_advance (di, 1);
3010 return d_template_args_1 (di);
3013 /* <template-arg>* E */
3015 static struct demangle_component *
3016 d_template_args_1 (struct d_info *di)
3018 struct demangle_component *hold_last_name;
3019 struct demangle_component *al;
3020 struct demangle_component **pal;
3022 /* Preserve the last name we saw--don't let the template arguments
3023 clobber it, as that would give us the wrong name for a subsequent
3024 constructor or destructor. */
3025 hold_last_name = di->last_name;
3027 if (d_peek_char (di) == 'E')
3029 /* An argument pack can be empty. */
3030 d_advance (di, 1);
3031 return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, NULL, NULL);
3034 al = NULL;
3035 pal = &al;
3036 while (1)
3038 struct demangle_component *a;
3040 a = d_template_arg (di);
3041 if (a == NULL)
3042 return NULL;
3044 *pal = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, a, NULL);
3045 if (*pal == NULL)
3046 return NULL;
3047 pal = &d_right (*pal);
3049 if (d_peek_char (di) == 'E')
3051 d_advance (di, 1);
3052 break;
3056 di->last_name = hold_last_name;
3058 return al;
3061 /* <template-arg> ::= <type>
3062 ::= X <expression> E
3063 ::= <expr-primary>
3066 static struct demangle_component *
3067 d_template_arg (struct d_info *di)
3069 struct demangle_component *ret;
3071 switch (d_peek_char (di))
3073 case 'X':
3074 d_advance (di, 1);
3075 ret = d_expression (di);
3076 if (! d_check_char (di, 'E'))
3077 return NULL;
3078 return ret;
3080 case 'L':
3081 return d_expr_primary (di);
3083 case 'I':
3084 case 'J':
3085 /* An argument pack. */
3086 return d_template_args (di);
3088 default:
3089 return cplus_demangle_type (di);
3093 /* Parse a sequence of expressions until we hit the terminator
3094 character. */
3096 static struct demangle_component *
3097 d_exprlist (struct d_info *di, char terminator)
3099 struct demangle_component *list = NULL;
3100 struct demangle_component **p = &list;
3102 if (d_peek_char (di) == terminator)
3104 d_advance (di, 1);
3105 return d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, NULL, NULL);
3108 while (1)
3110 struct demangle_component *arg = d_expression (di);
3111 if (arg == NULL)
3112 return NULL;
3114 *p = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, arg, NULL);
3115 if (*p == NULL)
3116 return NULL;
3117 p = &d_right (*p);
3119 if (d_peek_char (di) == terminator)
3121 d_advance (di, 1);
3122 break;
3126 return list;
3129 /* Returns nonzero iff OP is an operator for a C++ cast: const_cast,
3130 dynamic_cast, static_cast or reinterpret_cast. */
3132 static int
3133 op_is_new_cast (struct demangle_component *op)
3135 const char *code = op->u.s_operator.op->code;
3136 return (code[1] == 'c'
3137 && (code[0] == 's' || code[0] == 'd'
3138 || code[0] == 'c' || code[0] == 'r'));
3141 /* <expression> ::= <(unary) operator-name> <expression>
3142 ::= <(binary) operator-name> <expression> <expression>
3143 ::= <(trinary) operator-name> <expression> <expression> <expression>
3144 ::= cl <expression>+ E
3145 ::= st <type>
3146 ::= <template-param>
3147 ::= sr <type> <unqualified-name>
3148 ::= sr <type> <unqualified-name> <template-args>
3149 ::= <expr-primary>
3152 static inline struct demangle_component *
3153 d_expression_1 (struct d_info *di)
3155 char peek;
3157 peek = d_peek_char (di);
3158 if (peek == 'L')
3159 return d_expr_primary (di);
3160 else if (peek == 'T')
3161 return d_template_param (di);
3162 else if (peek == 's' && d_peek_next_char (di) == 'r')
3164 struct demangle_component *type;
3165 struct demangle_component *name;
3167 d_advance (di, 2);
3168 type = cplus_demangle_type (di);
3169 name = d_unqualified_name (di);
3170 if (d_peek_char (di) != 'I')
3171 return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type, name);
3172 else
3173 return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type,
3174 d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
3175 d_template_args (di)));
3177 else if (peek == 's' && d_peek_next_char (di) == 'p')
3179 d_advance (di, 2);
3180 return d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION,
3181 d_expression_1 (di), NULL);
3183 else if (peek == 'f' && d_peek_next_char (di) == 'p')
3185 /* Function parameter used in a late-specified return type. */
3186 int index;
3187 d_advance (di, 2);
3188 if (d_peek_char (di) == 'T')
3190 /* 'this' parameter. */
3191 d_advance (di, 1);
3192 index = 0;
3194 else
3196 index = d_compact_number (di);
3197 if (index == INT_MAX || index == -1)
3198 return NULL;
3199 index++;
3201 return d_make_function_param (di, index);
3203 else if (IS_DIGIT (peek)
3204 || (peek == 'o' && d_peek_next_char (di) == 'n'))
3206 /* We can get an unqualified name as an expression in the case of
3207 a dependent function call, i.e. decltype(f(t)). */
3208 struct demangle_component *name;
3210 if (peek == 'o')
3211 /* operator-function-id, i.e. operator+(t). */
3212 d_advance (di, 2);
3214 name = d_unqualified_name (di);
3215 if (name == NULL)
3216 return NULL;
3217 if (d_peek_char (di) == 'I')
3218 return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
3219 d_template_args (di));
3220 else
3221 return name;
3223 else if ((peek == 'i' || peek == 't')
3224 && d_peek_next_char (di) == 'l')
3226 /* Brace-enclosed initializer list, untyped or typed. */
3227 struct demangle_component *type = NULL;
3228 if (peek == 't')
3229 type = cplus_demangle_type (di);
3230 if (!d_peek_next_char (di))
3231 return NULL;
3232 d_advance (di, 2);
3233 return d_make_comp (di, DEMANGLE_COMPONENT_INITIALIZER_LIST,
3234 type, d_exprlist (di, 'E'));
3236 else
3238 struct demangle_component *op;
3239 const char *code = NULL;
3240 int args;
3242 op = d_operator_name (di);
3243 if (op == NULL)
3244 return NULL;
3246 if (op->type == DEMANGLE_COMPONENT_OPERATOR)
3248 code = op->u.s_operator.op->code;
3249 di->expansion += op->u.s_operator.op->len - 2;
3250 if (strcmp (code, "st") == 0)
3251 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
3252 cplus_demangle_type (di));
3255 switch (op->type)
3257 default:
3258 return NULL;
3259 case DEMANGLE_COMPONENT_OPERATOR:
3260 args = op->u.s_operator.op->args;
3261 break;
3262 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
3263 args = op->u.s_extended_operator.args;
3264 break;
3265 case DEMANGLE_COMPONENT_CAST:
3266 args = 1;
3267 break;
3270 switch (args)
3272 case 0:
3273 return d_make_comp (di, DEMANGLE_COMPONENT_NULLARY, op, NULL);
3275 case 1:
3277 struct demangle_component *operand;
3278 int suffix = 0;
3280 if (code && (code[0] == 'p' || code[0] == 'm')
3281 && code[1] == code[0])
3282 /* pp_ and mm_ are the prefix variants. */
3283 suffix = !d_check_char (di, '_');
3285 if (op->type == DEMANGLE_COMPONENT_CAST
3286 && d_check_char (di, '_'))
3287 operand = d_exprlist (di, 'E');
3288 else if (code && !strcmp (code, "sP"))
3289 operand = d_template_args_1 (di);
3290 else
3291 operand = d_expression_1 (di);
3293 if (suffix)
3294 /* Indicate the suffix variant for d_print_comp. */
3295 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
3296 d_make_comp (di,
3297 DEMANGLE_COMPONENT_BINARY_ARGS,
3298 operand, operand));
3299 else
3300 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
3301 operand);
3303 case 2:
3305 struct demangle_component *left;
3306 struct demangle_component *right;
3308 if (code == NULL)
3309 return NULL;
3310 if (op_is_new_cast (op))
3311 left = cplus_demangle_type (di);
3312 else if (code[0] == 'f')
3313 /* fold-expression. */
3314 left = d_operator_name (di);
3315 else
3316 left = d_expression_1 (di);
3317 if (!strcmp (code, "cl"))
3318 right = d_exprlist (di, 'E');
3319 else if (!strcmp (code, "dt") || !strcmp (code, "pt"))
3321 right = d_unqualified_name (di);
3322 if (d_peek_char (di) == 'I')
3323 right = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE,
3324 right, d_template_args (di));
3326 else
3327 right = d_expression_1 (di);
3329 return d_make_comp (di, DEMANGLE_COMPONENT_BINARY, op,
3330 d_make_comp (di,
3331 DEMANGLE_COMPONENT_BINARY_ARGS,
3332 left, right));
3334 case 3:
3336 struct demangle_component *first;
3337 struct demangle_component *second;
3338 struct demangle_component *third;
3340 if (code == NULL)
3341 return NULL;
3342 else if (!strcmp (code, "qu"))
3344 /* ?: expression. */
3345 first = d_expression_1 (di);
3346 second = d_expression_1 (di);
3347 third = d_expression_1 (di);
3349 else if (code[0] == 'f')
3351 /* fold-expression. */
3352 first = d_operator_name (di);
3353 second = d_expression_1 (di);
3354 third = d_expression_1 (di);
3356 else if (code[0] == 'n')
3358 /* new-expression. */
3359 if (code[1] != 'w' && code[1] != 'a')
3360 return NULL;
3361 first = d_exprlist (di, '_');
3362 second = cplus_demangle_type (di);
3363 if (d_peek_char (di) == 'E')
3365 d_advance (di, 1);
3366 third = NULL;
3368 else if (d_peek_char (di) == 'p'
3369 && d_peek_next_char (di) == 'i')
3371 /* Parenthesized initializer. */
3372 d_advance (di, 2);
3373 third = d_exprlist (di, 'E');
3375 else if (d_peek_char (di) == 'i'
3376 && d_peek_next_char (di) == 'l')
3377 /* initializer-list. */
3378 third = d_expression_1 (di);
3379 else
3380 return NULL;
3382 else
3383 return NULL;
3384 return d_make_comp (di, DEMANGLE_COMPONENT_TRINARY, op,
3385 d_make_comp (di,
3386 DEMANGLE_COMPONENT_TRINARY_ARG1,
3387 first,
3388 d_make_comp (di,
3389 DEMANGLE_COMPONENT_TRINARY_ARG2,
3390 second, third)));
3392 default:
3393 return NULL;
3398 static struct demangle_component *
3399 d_expression (struct d_info *di)
3401 struct demangle_component *ret;
3402 int was_expression = di->is_expression;
3404 di->is_expression = 1;
3405 ret = d_expression_1 (di);
3406 di->is_expression = was_expression;
3407 return ret;
3410 /* <expr-primary> ::= L <type> <(value) number> E
3411 ::= L <type> <(value) float> E
3412 ::= L <mangled-name> E
3415 static struct demangle_component *
3416 d_expr_primary (struct d_info *di)
3418 struct demangle_component *ret;
3420 if (! d_check_char (di, 'L'))
3421 return NULL;
3422 if (d_peek_char (di) == '_'
3423 /* Workaround for G++ bug; see comment in write_template_arg. */
3424 || d_peek_char (di) == 'Z')
3425 ret = cplus_demangle_mangled_name (di, 0);
3426 else
3428 struct demangle_component *type;
3429 enum demangle_component_type t;
3430 const char *s;
3432 type = cplus_demangle_type (di);
3433 if (type == NULL)
3434 return NULL;
3436 /* If we have a type we know how to print, we aren't going to
3437 print the type name itself. */
3438 if (type->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
3439 && type->u.s_builtin.type->print != D_PRINT_DEFAULT)
3440 di->expansion -= type->u.s_builtin.type->len;
3442 /* Rather than try to interpret the literal value, we just
3443 collect it as a string. Note that it's possible to have a
3444 floating point literal here. The ABI specifies that the
3445 format of such literals is machine independent. That's fine,
3446 but what's not fine is that versions of g++ up to 3.2 with
3447 -fabi-version=1 used upper case letters in the hex constant,
3448 and dumped out gcc's internal representation. That makes it
3449 hard to tell where the constant ends, and hard to dump the
3450 constant in any readable form anyhow. We don't attempt to
3451 handle these cases. */
3453 t = DEMANGLE_COMPONENT_LITERAL;
3454 if (d_peek_char (di) == 'n')
3456 t = DEMANGLE_COMPONENT_LITERAL_NEG;
3457 d_advance (di, 1);
3459 s = d_str (di);
3460 while (d_peek_char (di) != 'E')
3462 if (d_peek_char (di) == '\0')
3463 return NULL;
3464 d_advance (di, 1);
3466 ret = d_make_comp (di, t, type, d_make_name (di, s, d_str (di) - s));
3468 if (! d_check_char (di, 'E'))
3469 return NULL;
3470 return ret;
3473 /* <local-name> ::= Z <(function) encoding> E <(entity) name> [<discriminator>]
3474 ::= Z <(function) encoding> E s [<discriminator>]
3475 ::= Z <(function) encoding> E d [<parameter> number>] _ <entity name>
3478 static struct demangle_component *
3479 d_local_name (struct d_info *di)
3481 struct demangle_component *function;
3483 if (! d_check_char (di, 'Z'))
3484 return NULL;
3486 function = d_encoding (di, 0);
3488 if (! d_check_char (di, 'E'))
3489 return NULL;
3491 if (d_peek_char (di) == 's')
3493 d_advance (di, 1);
3494 if (! d_discriminator (di))
3495 return NULL;
3496 return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function,
3497 d_make_name (di, "string literal",
3498 sizeof "string literal" - 1));
3500 else
3502 struct demangle_component *name;
3503 int num = -1;
3505 if (d_peek_char (di) == 'd')
3507 /* Default argument scope: d <number> _. */
3508 d_advance (di, 1);
3509 num = d_compact_number (di);
3510 if (num < 0)
3511 return NULL;
3514 name = d_name (di);
3515 if (name)
3516 switch (name->type)
3518 /* Lambdas and unnamed types have internal discriminators. */
3519 case DEMANGLE_COMPONENT_LAMBDA:
3520 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
3521 break;
3522 default:
3523 if (! d_discriminator (di))
3524 return NULL;
3526 if (num >= 0)
3527 name = d_make_default_arg (di, num, name);
3528 return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function, name);
3532 /* <discriminator> ::= _ <(non-negative) number>
3534 We demangle the discriminator, but we don't print it out. FIXME:
3535 We should print it out in verbose mode. */
3537 static int
3538 d_discriminator (struct d_info *di)
3540 int discrim;
3542 if (d_peek_char (di) != '_')
3543 return 1;
3544 d_advance (di, 1);
3545 discrim = d_number (di);
3546 if (discrim < 0)
3547 return 0;
3548 return 1;
3551 /* <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _ */
3553 static struct demangle_component *
3554 d_lambda (struct d_info *di)
3556 struct demangle_component *tl;
3557 struct demangle_component *ret;
3558 int num;
3560 if (! d_check_char (di, 'U'))
3561 return NULL;
3562 if (! d_check_char (di, 'l'))
3563 return NULL;
3565 tl = d_parmlist (di);
3566 if (tl == NULL)
3567 return NULL;
3569 if (! d_check_char (di, 'E'))
3570 return NULL;
3572 num = d_compact_number (di);
3573 if (num < 0)
3574 return NULL;
3576 ret = d_make_empty (di);
3577 if (ret)
3579 ret->type = DEMANGLE_COMPONENT_LAMBDA;
3580 ret->u.s_unary_num.sub = tl;
3581 ret->u.s_unary_num.num = num;
3584 if (! d_add_substitution (di, ret))
3585 return NULL;
3587 return ret;
3590 /* <unnamed-type-name> ::= Ut [ <nonnegative number> ] _ */
3592 static struct demangle_component *
3593 d_unnamed_type (struct d_info *di)
3595 struct demangle_component *ret;
3596 int num;
3598 if (! d_check_char (di, 'U'))
3599 return NULL;
3600 if (! d_check_char (di, 't'))
3601 return NULL;
3603 num = d_compact_number (di);
3604 if (num < 0)
3605 return NULL;
3607 ret = d_make_empty (di);
3608 if (ret)
3610 ret->type = DEMANGLE_COMPONENT_UNNAMED_TYPE;
3611 ret->u.s_number.number = num;
3614 if (! d_add_substitution (di, ret))
3615 return NULL;
3617 return ret;
3620 /* <clone-suffix> ::= [ . <clone-type-identifier> ] [ . <nonnegative number> ]*
3623 static struct demangle_component *
3624 d_clone_suffix (struct d_info *di, struct demangle_component *encoding)
3626 const char *suffix = d_str (di);
3627 const char *pend = suffix;
3628 struct demangle_component *n;
3630 if (*pend == '.' && (IS_LOWER (pend[1]) || pend[1] == '_'))
3632 pend += 2;
3633 while (IS_LOWER (*pend) || *pend == '_')
3634 ++pend;
3636 while (*pend == '.' && IS_DIGIT (pend[1]))
3638 pend += 2;
3639 while (IS_DIGIT (*pend))
3640 ++pend;
3642 d_advance (di, pend - suffix);
3643 n = d_make_name (di, suffix, pend - suffix);
3644 return d_make_comp (di, DEMANGLE_COMPONENT_CLONE, encoding, n);
3647 /* Add a new substitution. */
3649 static int
3650 d_add_substitution (struct d_info *di, struct demangle_component *dc)
3652 if (dc == NULL)
3653 return 0;
3654 if (di->next_sub >= di->num_subs)
3655 return 0;
3656 di->subs[di->next_sub] = dc;
3657 ++di->next_sub;
3658 return 1;
3661 /* <substitution> ::= S <seq-id> _
3662 ::= S_
3663 ::= St
3664 ::= Sa
3665 ::= Sb
3666 ::= Ss
3667 ::= Si
3668 ::= So
3669 ::= Sd
3671 If PREFIX is non-zero, then this type is being used as a prefix in
3672 a qualified name. In this case, for the standard substitutions, we
3673 need to check whether we are being used as a prefix for a
3674 constructor or destructor, and return a full template name.
3675 Otherwise we will get something like std::iostream::~iostream()
3676 which does not correspond particularly well to any function which
3677 actually appears in the source.
3680 static const struct d_standard_sub_info standard_subs[] =
3682 { 't', NL ("std"),
3683 NL ("std"),
3684 NULL, 0 },
3685 { 'a', NL ("std::allocator"),
3686 NL ("std::allocator"),
3687 NL ("allocator") },
3688 { 'b', NL ("std::basic_string"),
3689 NL ("std::basic_string"),
3690 NL ("basic_string") },
3691 { 's', NL ("std::string"),
3692 NL ("std::basic_string<char, std::char_traits<char>, std::allocator<char> >"),
3693 NL ("basic_string") },
3694 { 'i', NL ("std::istream"),
3695 NL ("std::basic_istream<char, std::char_traits<char> >"),
3696 NL ("basic_istream") },
3697 { 'o', NL ("std::ostream"),
3698 NL ("std::basic_ostream<char, std::char_traits<char> >"),
3699 NL ("basic_ostream") },
3700 { 'd', NL ("std::iostream"),
3701 NL ("std::basic_iostream<char, std::char_traits<char> >"),
3702 NL ("basic_iostream") }
3705 static struct demangle_component *
3706 d_substitution (struct d_info *di, int prefix)
3708 char c;
3710 if (! d_check_char (di, 'S'))
3711 return NULL;
3713 c = d_next_char (di);
3714 if (c == '_' || IS_DIGIT (c) || IS_UPPER (c))
3716 unsigned int id;
3718 id = 0;
3719 if (c != '_')
3723 unsigned int new_id;
3725 if (IS_DIGIT (c))
3726 new_id = id * 36 + c - '0';
3727 else if (IS_UPPER (c))
3728 new_id = id * 36 + c - 'A' + 10;
3729 else
3730 return NULL;
3731 if (new_id < id)
3732 return NULL;
3733 id = new_id;
3734 c = d_next_char (di);
3736 while (c != '_');
3738 ++id;
3741 if (id >= (unsigned int) di->next_sub)
3742 return NULL;
3744 ++di->did_subs;
3746 return di->subs[id];
3748 else
3750 int verbose;
3751 const struct d_standard_sub_info *p;
3752 const struct d_standard_sub_info *pend;
3754 verbose = (di->options & DMGL_VERBOSE) != 0;
3755 if (! verbose && prefix)
3757 char peek;
3759 peek = d_peek_char (di);
3760 if (peek == 'C' || peek == 'D')
3761 verbose = 1;
3764 pend = (&standard_subs[0]
3765 + sizeof standard_subs / sizeof standard_subs[0]);
3766 for (p = &standard_subs[0]; p < pend; ++p)
3768 if (c == p->code)
3770 const char *s;
3771 int len;
3772 struct demangle_component *c;
3774 if (p->set_last_name != NULL)
3775 di->last_name = d_make_sub (di, p->set_last_name,
3776 p->set_last_name_len);
3777 if (verbose)
3779 s = p->full_expansion;
3780 len = p->full_len;
3782 else
3784 s = p->simple_expansion;
3785 len = p->simple_len;
3787 di->expansion += len;
3788 c = d_make_sub (di, s, len);
3789 if (d_peek_char (di) == 'B')
3791 /* If there are ABI tags on the abbreviation, it becomes
3792 a substitution candidate. */
3793 c = d_abi_tags (di, c);
3794 d_add_substitution (di, c);
3796 return c;
3800 return NULL;
3804 static void
3805 d_checkpoint (struct d_info *di, struct d_info_checkpoint *checkpoint)
3807 checkpoint->n = di->n;
3808 checkpoint->next_comp = di->next_comp;
3809 checkpoint->next_sub = di->next_sub;
3810 checkpoint->did_subs = di->did_subs;
3811 checkpoint->expansion = di->expansion;
3814 static void
3815 d_backtrack (struct d_info *di, struct d_info_checkpoint *checkpoint)
3817 di->n = checkpoint->n;
3818 di->next_comp = checkpoint->next_comp;
3819 di->next_sub = checkpoint->next_sub;
3820 di->did_subs = checkpoint->did_subs;
3821 di->expansion = checkpoint->expansion;
3824 /* Initialize a growable string. */
3826 static void
3827 d_growable_string_init (struct d_growable_string *dgs, size_t estimate)
3829 dgs->buf = NULL;
3830 dgs->len = 0;
3831 dgs->alc = 0;
3832 dgs->allocation_failure = 0;
3834 if (estimate > 0)
3835 d_growable_string_resize (dgs, estimate);
3838 /* Grow a growable string to a given size. */
3840 static inline void
3841 d_growable_string_resize (struct d_growable_string *dgs, size_t need)
3843 size_t newalc;
3844 char *newbuf;
3846 if (dgs->allocation_failure)
3847 return;
3849 /* Start allocation at two bytes to avoid any possibility of confusion
3850 with the special value of 1 used as a return in *palc to indicate
3851 allocation failures. */
3852 newalc = dgs->alc > 0 ? dgs->alc : 2;
3853 while (newalc < need)
3854 newalc <<= 1;
3856 newbuf = (char *) realloc (dgs->buf, newalc);
3857 if (newbuf == NULL)
3859 free (dgs->buf);
3860 dgs->buf = NULL;
3861 dgs->len = 0;
3862 dgs->alc = 0;
3863 dgs->allocation_failure = 1;
3864 return;
3866 dgs->buf = newbuf;
3867 dgs->alc = newalc;
3870 /* Append a buffer to a growable string. */
3872 static inline void
3873 d_growable_string_append_buffer (struct d_growable_string *dgs,
3874 const char *s, size_t l)
3876 size_t need;
3878 need = dgs->len + l + 1;
3879 if (need > dgs->alc)
3880 d_growable_string_resize (dgs, need);
3882 if (dgs->allocation_failure)
3883 return;
3885 memcpy (dgs->buf + dgs->len, s, l);
3886 dgs->buf[dgs->len + l] = '\0';
3887 dgs->len += l;
3890 /* Bridge growable strings to the callback mechanism. */
3892 static void
3893 d_growable_string_callback_adapter (const char *s, size_t l, void *opaque)
3895 struct d_growable_string *dgs = (struct d_growable_string*) opaque;
3897 d_growable_string_append_buffer (dgs, s, l);
3900 /* Walk the tree, counting the number of templates encountered, and
3901 the number of times a scope might be saved. These counts will be
3902 used to allocate data structures for d_print_comp, so the logic
3903 here must mirror the logic d_print_comp will use. It is not
3904 important that the resulting numbers are exact, so long as they
3905 are larger than the actual numbers encountered. */
3907 static void
3908 d_count_templates_scopes (int *num_templates, int *num_scopes,
3909 const struct demangle_component *dc)
3911 if (dc == NULL)
3912 return;
3914 switch (dc->type)
3916 case DEMANGLE_COMPONENT_NAME:
3917 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
3918 case DEMANGLE_COMPONENT_FUNCTION_PARAM:
3919 case DEMANGLE_COMPONENT_SUB_STD:
3920 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
3921 case DEMANGLE_COMPONENT_OPERATOR:
3922 case DEMANGLE_COMPONENT_CHARACTER:
3923 case DEMANGLE_COMPONENT_NUMBER:
3924 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
3925 break;
3927 case DEMANGLE_COMPONENT_TEMPLATE:
3928 (*num_templates)++;
3929 goto recurse_left_right;
3931 case DEMANGLE_COMPONENT_REFERENCE:
3932 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
3933 if (d_left (dc)->type == DEMANGLE_COMPONENT_TEMPLATE_PARAM)
3934 (*num_scopes)++;
3935 goto recurse_left_right;
3937 case DEMANGLE_COMPONENT_QUAL_NAME:
3938 case DEMANGLE_COMPONENT_LOCAL_NAME:
3939 case DEMANGLE_COMPONENT_TYPED_NAME:
3940 case DEMANGLE_COMPONENT_VTABLE:
3941 case DEMANGLE_COMPONENT_VTT:
3942 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
3943 case DEMANGLE_COMPONENT_TYPEINFO:
3944 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
3945 case DEMANGLE_COMPONENT_TYPEINFO_FN:
3946 case DEMANGLE_COMPONENT_THUNK:
3947 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
3948 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
3949 case DEMANGLE_COMPONENT_JAVA_CLASS:
3950 case DEMANGLE_COMPONENT_GUARD:
3951 case DEMANGLE_COMPONENT_TLS_INIT:
3952 case DEMANGLE_COMPONENT_TLS_WRAPPER:
3953 case DEMANGLE_COMPONENT_REFTEMP:
3954 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
3955 case DEMANGLE_COMPONENT_RESTRICT:
3956 case DEMANGLE_COMPONENT_VOLATILE:
3957 case DEMANGLE_COMPONENT_CONST:
3958 case DEMANGLE_COMPONENT_RESTRICT_THIS:
3959 case DEMANGLE_COMPONENT_VOLATILE_THIS:
3960 case DEMANGLE_COMPONENT_CONST_THIS:
3961 case DEMANGLE_COMPONENT_REFERENCE_THIS:
3962 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
3963 case DEMANGLE_COMPONENT_TRANSACTION_SAFE:
3964 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
3965 case DEMANGLE_COMPONENT_POINTER:
3966 case DEMANGLE_COMPONENT_COMPLEX:
3967 case DEMANGLE_COMPONENT_IMAGINARY:
3968 case DEMANGLE_COMPONENT_VENDOR_TYPE:
3969 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
3970 case DEMANGLE_COMPONENT_ARRAY_TYPE:
3971 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
3972 case DEMANGLE_COMPONENT_VECTOR_TYPE:
3973 case DEMANGLE_COMPONENT_ARGLIST:
3974 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
3975 case DEMANGLE_COMPONENT_INITIALIZER_LIST:
3976 case DEMANGLE_COMPONENT_CAST:
3977 case DEMANGLE_COMPONENT_CONVERSION:
3978 case DEMANGLE_COMPONENT_NULLARY:
3979 case DEMANGLE_COMPONENT_UNARY:
3980 case DEMANGLE_COMPONENT_BINARY:
3981 case DEMANGLE_COMPONENT_BINARY_ARGS:
3982 case DEMANGLE_COMPONENT_TRINARY:
3983 case DEMANGLE_COMPONENT_TRINARY_ARG1:
3984 case DEMANGLE_COMPONENT_TRINARY_ARG2:
3985 case DEMANGLE_COMPONENT_LITERAL:
3986 case DEMANGLE_COMPONENT_LITERAL_NEG:
3987 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
3988 case DEMANGLE_COMPONENT_COMPOUND_NAME:
3989 case DEMANGLE_COMPONENT_DECLTYPE:
3990 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
3991 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
3992 case DEMANGLE_COMPONENT_PACK_EXPANSION:
3993 case DEMANGLE_COMPONENT_TAGGED_NAME:
3994 case DEMANGLE_COMPONENT_CLONE:
3995 recurse_left_right:
3996 d_count_templates_scopes (num_templates, num_scopes,
3997 d_left (dc));
3998 d_count_templates_scopes (num_templates, num_scopes,
3999 d_right (dc));
4000 break;
4002 case DEMANGLE_COMPONENT_CTOR:
4003 d_count_templates_scopes (num_templates, num_scopes,
4004 dc->u.s_ctor.name);
4005 break;
4007 case DEMANGLE_COMPONENT_DTOR:
4008 d_count_templates_scopes (num_templates, num_scopes,
4009 dc->u.s_dtor.name);
4010 break;
4012 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
4013 d_count_templates_scopes (num_templates, num_scopes,
4014 dc->u.s_extended_operator.name);
4015 break;
4017 case DEMANGLE_COMPONENT_FIXED_TYPE:
4018 d_count_templates_scopes (num_templates, num_scopes,
4019 dc->u.s_fixed.length);
4020 break;
4022 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
4023 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
4024 d_count_templates_scopes (num_templates, num_scopes,
4025 d_left (dc));
4026 break;
4028 case DEMANGLE_COMPONENT_LAMBDA:
4029 case DEMANGLE_COMPONENT_DEFAULT_ARG:
4030 d_count_templates_scopes (num_templates, num_scopes,
4031 dc->u.s_unary_num.sub);
4032 break;
4036 /* Initialize a print information structure. */
4038 static void
4039 d_print_init (struct d_print_info *dpi, demangle_callbackref callback,
4040 void *opaque, const struct demangle_component *dc)
4042 dpi->len = 0;
4043 dpi->last_char = '\0';
4044 dpi->templates = NULL;
4045 dpi->modifiers = NULL;
4046 dpi->pack_index = 0;
4047 dpi->flush_count = 0;
4049 dpi->callback = callback;
4050 dpi->opaque = opaque;
4052 dpi->demangle_failure = 0;
4054 dpi->component_stack = NULL;
4056 dpi->saved_scopes = NULL;
4057 dpi->next_saved_scope = 0;
4058 dpi->num_saved_scopes = 0;
4060 dpi->copy_templates = NULL;
4061 dpi->next_copy_template = 0;
4062 dpi->num_copy_templates = 0;
4064 d_count_templates_scopes (&dpi->num_copy_templates,
4065 &dpi->num_saved_scopes, dc);
4066 dpi->num_copy_templates *= dpi->num_saved_scopes;
4068 dpi->current_template = NULL;
4071 /* Indicate that an error occurred during printing, and test for error. */
4073 static inline void
4074 d_print_error (struct d_print_info *dpi)
4076 dpi->demangle_failure = 1;
4079 static inline int
4080 d_print_saw_error (struct d_print_info *dpi)
4082 return dpi->demangle_failure != 0;
4085 /* Flush buffered characters to the callback. */
4087 static inline void
4088 d_print_flush (struct d_print_info *dpi)
4090 dpi->buf[dpi->len] = '\0';
4091 dpi->callback (dpi->buf, dpi->len, dpi->opaque);
4092 dpi->len = 0;
4093 dpi->flush_count++;
4096 /* Append characters and buffers for printing. */
4098 static inline void
4099 d_append_char (struct d_print_info *dpi, char c)
4101 if (dpi->len == sizeof (dpi->buf) - 1)
4102 d_print_flush (dpi);
4104 dpi->buf[dpi->len++] = c;
4105 dpi->last_char = c;
4108 static inline void
4109 d_append_buffer (struct d_print_info *dpi, const char *s, size_t l)
4111 size_t i;
4113 for (i = 0; i < l; i++)
4114 d_append_char (dpi, s[i]);
4117 static inline void
4118 d_append_string (struct d_print_info *dpi, const char *s)
4120 d_append_buffer (dpi, s, strlen (s));
4123 static inline void
4124 d_append_num (struct d_print_info *dpi, int l)
4126 char buf[25];
4127 sprintf (buf,"%d", l);
4128 d_append_string (dpi, buf);
4131 static inline char
4132 d_last_char (struct d_print_info *dpi)
4134 return dpi->last_char;
4137 /* Turn components into a human readable string. OPTIONS is the
4138 options bits passed to the demangler. DC is the tree to print.
4139 CALLBACK is a function to call to flush demangled string segments
4140 as they fill the intermediate buffer, and OPAQUE is a generalized
4141 callback argument. On success, this returns 1. On failure,
4142 it returns 0, indicating a bad parse. It does not use heap
4143 memory to build an output string, so cannot encounter memory
4144 allocation failure. */
4146 CP_STATIC_IF_GLIBCPP_V3
4148 cplus_demangle_print_callback (int options,
4149 const struct demangle_component *dc,
4150 demangle_callbackref callback, void *opaque)
4152 struct d_print_info dpi;
4154 d_print_init (&dpi, callback, opaque, dc);
4157 #ifdef CP_DYNAMIC_ARRAYS
4158 /* Avoid zero-length VLAs, which are prohibited by the C99 standard
4159 and flagged as errors by Address Sanitizer. */
4160 __extension__ struct d_saved_scope scopes[(dpi.num_saved_scopes > 0)
4161 ? dpi.num_saved_scopes : 1];
4162 __extension__ struct d_print_template temps[(dpi.num_copy_templates > 0)
4163 ? dpi.num_copy_templates : 1];
4165 dpi.saved_scopes = scopes;
4166 dpi.copy_templates = temps;
4167 #else
4168 dpi.saved_scopes = alloca (dpi.num_saved_scopes
4169 * sizeof (*dpi.saved_scopes));
4170 dpi.copy_templates = alloca (dpi.num_copy_templates
4171 * sizeof (*dpi.copy_templates));
4172 #endif
4174 d_print_comp (&dpi, options, dc);
4177 d_print_flush (&dpi);
4179 return ! d_print_saw_error (&dpi);
4182 /* Turn components into a human readable string. OPTIONS is the
4183 options bits passed to the demangler. DC is the tree to print.
4184 ESTIMATE is a guess at the length of the result. This returns a
4185 string allocated by malloc, or NULL on error. On success, this
4186 sets *PALC to the size of the allocated buffer. On failure, this
4187 sets *PALC to 0 for a bad parse, or to 1 for a memory allocation
4188 failure. */
4190 CP_STATIC_IF_GLIBCPP_V3
4191 char *
4192 cplus_demangle_print (int options, const struct demangle_component *dc,
4193 int estimate, size_t *palc)
4195 struct d_growable_string dgs;
4197 d_growable_string_init (&dgs, estimate);
4199 if (! cplus_demangle_print_callback (options, dc,
4200 d_growable_string_callback_adapter,
4201 &dgs))
4203 free (dgs.buf);
4204 *palc = 0;
4205 return NULL;
4208 *palc = dgs.allocation_failure ? 1 : dgs.alc;
4209 return dgs.buf;
4212 /* Returns the I'th element of the template arglist ARGS, or NULL on
4213 failure. If I is negative, return the entire arglist. */
4215 static struct demangle_component *
4216 d_index_template_argument (struct demangle_component *args, int i)
4218 struct demangle_component *a;
4220 if (i < 0)
4221 /* Print the whole argument pack. */
4222 return args;
4224 for (a = args;
4225 a != NULL;
4226 a = d_right (a))
4228 if (a->type != DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4229 return NULL;
4230 if (i <= 0)
4231 break;
4232 --i;
4234 if (i != 0 || a == NULL)
4235 return NULL;
4237 return d_left (a);
4240 /* Returns the template argument from the current context indicated by DC,
4241 which is a DEMANGLE_COMPONENT_TEMPLATE_PARAM, or NULL. */
4243 static struct demangle_component *
4244 d_lookup_template_argument (struct d_print_info *dpi,
4245 const struct demangle_component *dc)
4247 if (dpi->templates == NULL)
4249 d_print_error (dpi);
4250 return NULL;
4253 return d_index_template_argument
4254 (d_right (dpi->templates->template_decl),
4255 dc->u.s_number.number);
4258 /* Returns a template argument pack used in DC (any will do), or NULL. */
4260 static struct demangle_component *
4261 d_find_pack (struct d_print_info *dpi,
4262 const struct demangle_component *dc)
4264 struct demangle_component *a;
4265 if (dc == NULL)
4266 return NULL;
4268 switch (dc->type)
4270 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
4271 a = d_lookup_template_argument (dpi, dc);
4272 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4273 return a;
4274 return NULL;
4276 case DEMANGLE_COMPONENT_PACK_EXPANSION:
4277 return NULL;
4279 case DEMANGLE_COMPONENT_LAMBDA:
4280 case DEMANGLE_COMPONENT_NAME:
4281 case DEMANGLE_COMPONENT_TAGGED_NAME:
4282 case DEMANGLE_COMPONENT_OPERATOR:
4283 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
4284 case DEMANGLE_COMPONENT_SUB_STD:
4285 case DEMANGLE_COMPONENT_CHARACTER:
4286 case DEMANGLE_COMPONENT_FUNCTION_PARAM:
4287 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
4288 case DEMANGLE_COMPONENT_FIXED_TYPE:
4289 case DEMANGLE_COMPONENT_DEFAULT_ARG:
4290 case DEMANGLE_COMPONENT_NUMBER:
4291 return NULL;
4293 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
4294 return d_find_pack (dpi, dc->u.s_extended_operator.name);
4295 case DEMANGLE_COMPONENT_CTOR:
4296 return d_find_pack (dpi, dc->u.s_ctor.name);
4297 case DEMANGLE_COMPONENT_DTOR:
4298 return d_find_pack (dpi, dc->u.s_dtor.name);
4300 default:
4301 a = d_find_pack (dpi, d_left (dc));
4302 if (a)
4303 return a;
4304 return d_find_pack (dpi, d_right (dc));
4308 /* Returns the length of the template argument pack DC. */
4310 static int
4311 d_pack_length (const struct demangle_component *dc)
4313 int count = 0;
4314 while (dc && dc->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
4315 && d_left (dc) != NULL)
4317 ++count;
4318 dc = d_right (dc);
4320 return count;
4323 /* Returns the number of template args in DC, expanding any pack expansions
4324 found there. */
4326 static int
4327 d_args_length (struct d_print_info *dpi, const struct demangle_component *dc)
4329 int count = 0;
4330 for (; dc && dc->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST;
4331 dc = d_right (dc))
4333 struct demangle_component *elt = d_left (dc);
4334 if (elt == NULL)
4335 break;
4336 if (elt->type == DEMANGLE_COMPONENT_PACK_EXPANSION)
4338 struct demangle_component *a = d_find_pack (dpi, d_left (elt));
4339 count += d_pack_length (a);
4341 else
4342 ++count;
4344 return count;
4347 /* DC is a component of a mangled expression. Print it, wrapped in parens
4348 if needed. */
4350 static void
4351 d_print_subexpr (struct d_print_info *dpi, int options,
4352 const struct demangle_component *dc)
4354 int simple = 0;
4355 if (dc->type == DEMANGLE_COMPONENT_NAME
4356 || dc->type == DEMANGLE_COMPONENT_QUAL_NAME
4357 || dc->type == DEMANGLE_COMPONENT_INITIALIZER_LIST
4358 || dc->type == DEMANGLE_COMPONENT_FUNCTION_PARAM)
4359 simple = 1;
4360 if (!simple)
4361 d_append_char (dpi, '(');
4362 d_print_comp (dpi, options, dc);
4363 if (!simple)
4364 d_append_char (dpi, ')');
4367 /* Save the current scope. */
4369 static void
4370 d_save_scope (struct d_print_info *dpi,
4371 const struct demangle_component *container)
4373 struct d_saved_scope *scope;
4374 struct d_print_template *src, **link;
4376 if (dpi->next_saved_scope >= dpi->num_saved_scopes)
4378 d_print_error (dpi);
4379 return;
4381 scope = &dpi->saved_scopes[dpi->next_saved_scope];
4382 dpi->next_saved_scope++;
4384 scope->container = container;
4385 link = &scope->templates;
4387 for (src = dpi->templates; src != NULL; src = src->next)
4389 struct d_print_template *dst;
4391 if (dpi->next_copy_template >= dpi->num_copy_templates)
4393 d_print_error (dpi);
4394 return;
4396 dst = &dpi->copy_templates[dpi->next_copy_template];
4397 dpi->next_copy_template++;
4399 dst->template_decl = src->template_decl;
4400 *link = dst;
4401 link = &dst->next;
4404 *link = NULL;
4407 /* Attempt to locate a previously saved scope. Returns NULL if no
4408 corresponding saved scope was found. */
4410 static struct d_saved_scope *
4411 d_get_saved_scope (struct d_print_info *dpi,
4412 const struct demangle_component *container)
4414 int i;
4416 for (i = 0; i < dpi->next_saved_scope; i++)
4417 if (dpi->saved_scopes[i].container == container)
4418 return &dpi->saved_scopes[i];
4420 return NULL;
4423 /* If DC is a C++17 fold-expression, print it and return true; otherwise
4424 return false. */
4426 static int
4427 d_maybe_print_fold_expression (struct d_print_info *dpi, int options,
4428 const struct demangle_component *dc)
4430 const struct demangle_component *ops, *operator_, *op1, *op2;
4431 int save_idx;
4433 const char *fold_code = d_left (dc)->u.s_operator.op->code;
4434 if (fold_code[0] != 'f')
4435 return 0;
4437 ops = d_right (dc);
4438 operator_ = d_left (ops);
4439 op1 = d_right (ops);
4440 op2 = 0;
4441 if (op1->type == DEMANGLE_COMPONENT_TRINARY_ARG2)
4443 op2 = d_right (op1);
4444 op1 = d_left (op1);
4447 /* Print the whole pack. */
4448 save_idx = dpi->pack_index;
4449 dpi->pack_index = -1;
4451 switch (fold_code[1])
4453 /* Unary left fold, (... + X). */
4454 case 'l':
4455 d_append_string (dpi, "(...");
4456 d_print_expr_op (dpi, options, operator_);
4457 d_print_subexpr (dpi, options, op1);
4458 d_append_char (dpi, ')');
4459 break;
4461 /* Unary right fold, (X + ...). */
4462 case 'r':
4463 d_append_char (dpi, '(');
4464 d_print_subexpr (dpi, options, op1);
4465 d_print_expr_op (dpi, options, operator_);
4466 d_append_string (dpi, "...)");
4467 break;
4469 /* Binary left fold, (42 + ... + X). */
4470 case 'L':
4471 /* Binary right fold, (X + ... + 42). */
4472 case 'R':
4473 d_append_char (dpi, '(');
4474 d_print_subexpr (dpi, options, op1);
4475 d_print_expr_op (dpi, options, operator_);
4476 d_append_string (dpi, "...");
4477 d_print_expr_op (dpi, options, operator_);
4478 d_print_subexpr (dpi, options, op2);
4479 d_append_char (dpi, ')');
4480 break;
4483 dpi->pack_index = save_idx;
4484 return 1;
4487 /* Subroutine to handle components. */
4489 static void
4490 d_print_comp_inner (struct d_print_info *dpi, int options,
4491 const struct demangle_component *dc)
4493 /* Magic variable to let reference smashing skip over the next modifier
4494 without needing to modify *dc. */
4495 const struct demangle_component *mod_inner = NULL;
4497 /* Variable used to store the current templates while a previously
4498 captured scope is used. */
4499 struct d_print_template *saved_templates;
4501 /* Nonzero if templates have been stored in the above variable. */
4502 int need_template_restore = 0;
4504 if (dc == NULL)
4506 d_print_error (dpi);
4507 return;
4509 if (d_print_saw_error (dpi))
4510 return;
4512 switch (dc->type)
4514 case DEMANGLE_COMPONENT_NAME:
4515 if ((options & DMGL_JAVA) == 0)
4516 d_append_buffer (dpi, dc->u.s_name.s, dc->u.s_name.len);
4517 else
4518 d_print_java_identifier (dpi, dc->u.s_name.s, dc->u.s_name.len);
4519 return;
4521 case DEMANGLE_COMPONENT_TAGGED_NAME:
4522 d_print_comp (dpi, options, d_left (dc));
4523 d_append_string (dpi, "[abi:");
4524 d_print_comp (dpi, options, d_right (dc));
4525 d_append_char (dpi, ']');
4526 return;
4528 case DEMANGLE_COMPONENT_QUAL_NAME:
4529 case DEMANGLE_COMPONENT_LOCAL_NAME:
4530 d_print_comp (dpi, options, d_left (dc));
4531 if ((options & DMGL_JAVA) == 0)
4532 d_append_string (dpi, "::");
4533 else
4534 d_append_char (dpi, '.');
4536 struct demangle_component *local_name = d_right (dc);
4537 if (local_name->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
4539 d_append_string (dpi, "{default arg#");
4540 d_append_num (dpi, local_name->u.s_unary_num.num + 1);
4541 d_append_string (dpi, "}::");
4542 local_name = local_name->u.s_unary_num.sub;
4544 d_print_comp (dpi, options, local_name);
4546 return;
4548 case DEMANGLE_COMPONENT_TYPED_NAME:
4550 struct d_print_mod *hold_modifiers;
4551 struct demangle_component *typed_name;
4552 struct d_print_mod adpm[4];
4553 unsigned int i;
4554 struct d_print_template dpt;
4556 /* Pass the name down to the type so that it can be printed in
4557 the right place for the type. We also have to pass down
4558 any CV-qualifiers, which apply to the this parameter. */
4559 hold_modifiers = dpi->modifiers;
4560 dpi->modifiers = 0;
4561 i = 0;
4562 typed_name = d_left (dc);
4563 while (typed_name != NULL)
4565 if (i >= sizeof adpm / sizeof adpm[0])
4567 d_print_error (dpi);
4568 return;
4571 adpm[i].next = dpi->modifiers;
4572 dpi->modifiers = &adpm[i];
4573 adpm[i].mod = typed_name;
4574 adpm[i].printed = 0;
4575 adpm[i].templates = dpi->templates;
4576 ++i;
4578 if (typed_name->type != DEMANGLE_COMPONENT_RESTRICT_THIS
4579 && typed_name->type != DEMANGLE_COMPONENT_VOLATILE_THIS
4580 && typed_name->type != DEMANGLE_COMPONENT_CONST_THIS
4581 && typed_name->type != DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
4582 && typed_name->type != DEMANGLE_COMPONENT_TRANSACTION_SAFE
4583 && typed_name->type != DEMANGLE_COMPONENT_REFERENCE_THIS)
4584 break;
4586 typed_name = d_left (typed_name);
4589 if (typed_name == NULL)
4591 d_print_error (dpi);
4592 return;
4595 /* If typed_name is a template, then it applies to the
4596 function type as well. */
4597 if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
4599 dpt.next = dpi->templates;
4600 dpi->templates = &dpt;
4601 dpt.template_decl = typed_name;
4604 /* If typed_name is a DEMANGLE_COMPONENT_LOCAL_NAME, then
4605 there may be CV-qualifiers on its right argument which
4606 really apply here; this happens when parsing a class which
4607 is local to a function. */
4608 if (typed_name->type == DEMANGLE_COMPONENT_LOCAL_NAME)
4610 struct demangle_component *local_name;
4612 local_name = d_right (typed_name);
4613 if (local_name->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
4614 local_name = local_name->u.s_unary_num.sub;
4615 if (local_name == NULL)
4617 d_print_error (dpi);
4618 return;
4620 while (local_name->type == DEMANGLE_COMPONENT_RESTRICT_THIS
4621 || local_name->type == DEMANGLE_COMPONENT_VOLATILE_THIS
4622 || local_name->type == DEMANGLE_COMPONENT_CONST_THIS
4623 || local_name->type == DEMANGLE_COMPONENT_REFERENCE_THIS
4624 || local_name->type == DEMANGLE_COMPONENT_TRANSACTION_SAFE
4625 || (local_name->type
4626 == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS))
4628 if (i >= sizeof adpm / sizeof adpm[0])
4630 d_print_error (dpi);
4631 return;
4634 adpm[i] = adpm[i - 1];
4635 adpm[i].next = &adpm[i - 1];
4636 dpi->modifiers = &adpm[i];
4638 adpm[i - 1].mod = local_name;
4639 adpm[i - 1].printed = 0;
4640 adpm[i - 1].templates = dpi->templates;
4641 ++i;
4643 local_name = d_left (local_name);
4647 d_print_comp (dpi, options, d_right (dc));
4649 if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
4650 dpi->templates = dpt.next;
4652 /* If the modifiers didn't get printed by the type, print them
4653 now. */
4654 while (i > 0)
4656 --i;
4657 if (! adpm[i].printed)
4659 d_append_char (dpi, ' ');
4660 d_print_mod (dpi, options, adpm[i].mod);
4664 dpi->modifiers = hold_modifiers;
4666 return;
4669 case DEMANGLE_COMPONENT_TEMPLATE:
4671 struct d_print_mod *hold_dpm;
4672 struct demangle_component *dcl;
4673 const struct demangle_component *hold_current;
4675 /* This template may need to be referenced by a cast operator
4676 contained in its subtree. */
4677 hold_current = dpi->current_template;
4678 dpi->current_template = dc;
4680 /* Don't push modifiers into a template definition. Doing so
4681 could give the wrong definition for a template argument.
4682 Instead, treat the template essentially as a name. */
4684 hold_dpm = dpi->modifiers;
4685 dpi->modifiers = NULL;
4687 dcl = d_left (dc);
4689 if ((options & DMGL_JAVA) != 0
4690 && dcl->type == DEMANGLE_COMPONENT_NAME
4691 && dcl->u.s_name.len == 6
4692 && strncmp (dcl->u.s_name.s, "JArray", 6) == 0)
4694 /* Special-case Java arrays, so that JArray<TYPE> appears
4695 instead as TYPE[]. */
4697 d_print_comp (dpi, options, d_right (dc));
4698 d_append_string (dpi, "[]");
4700 else
4702 d_print_comp (dpi, options, dcl);
4703 if (d_last_char (dpi) == '<')
4704 d_append_char (dpi, ' ');
4705 d_append_char (dpi, '<');
4706 d_print_comp (dpi, options, d_right (dc));
4707 /* Avoid generating two consecutive '>' characters, to avoid
4708 the C++ syntactic ambiguity. */
4709 if (d_last_char (dpi) == '>')
4710 d_append_char (dpi, ' ');
4711 d_append_char (dpi, '>');
4714 dpi->modifiers = hold_dpm;
4715 dpi->current_template = hold_current;
4717 return;
4720 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
4722 struct d_print_template *hold_dpt;
4723 struct demangle_component *a = d_lookup_template_argument (dpi, dc);
4725 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4726 a = d_index_template_argument (a, dpi->pack_index);
4728 if (a == NULL)
4730 d_print_error (dpi);
4731 return;
4734 /* While processing this parameter, we need to pop the list of
4735 templates. This is because the template parameter may
4736 itself be a reference to a parameter of an outer
4737 template. */
4739 hold_dpt = dpi->templates;
4740 dpi->templates = hold_dpt->next;
4742 d_print_comp (dpi, options, a);
4744 dpi->templates = hold_dpt;
4746 return;
4749 case DEMANGLE_COMPONENT_CTOR:
4750 d_print_comp (dpi, options, dc->u.s_ctor.name);
4751 return;
4753 case DEMANGLE_COMPONENT_DTOR:
4754 d_append_char (dpi, '~');
4755 d_print_comp (dpi, options, dc->u.s_dtor.name);
4756 return;
4758 case DEMANGLE_COMPONENT_VTABLE:
4759 d_append_string (dpi, "vtable for ");
4760 d_print_comp (dpi, options, d_left (dc));
4761 return;
4763 case DEMANGLE_COMPONENT_VTT:
4764 d_append_string (dpi, "VTT for ");
4765 d_print_comp (dpi, options, d_left (dc));
4766 return;
4768 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
4769 d_append_string (dpi, "construction vtable for ");
4770 d_print_comp (dpi, options, d_left (dc));
4771 d_append_string (dpi, "-in-");
4772 d_print_comp (dpi, options, d_right (dc));
4773 return;
4775 case DEMANGLE_COMPONENT_TYPEINFO:
4776 d_append_string (dpi, "typeinfo for ");
4777 d_print_comp (dpi, options, d_left (dc));
4778 return;
4780 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
4781 d_append_string (dpi, "typeinfo name for ");
4782 d_print_comp (dpi, options, d_left (dc));
4783 return;
4785 case DEMANGLE_COMPONENT_TYPEINFO_FN:
4786 d_append_string (dpi, "typeinfo fn for ");
4787 d_print_comp (dpi, options, d_left (dc));
4788 return;
4790 case DEMANGLE_COMPONENT_THUNK:
4791 d_append_string (dpi, "non-virtual thunk to ");
4792 d_print_comp (dpi, options, d_left (dc));
4793 return;
4795 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
4796 d_append_string (dpi, "virtual thunk to ");
4797 d_print_comp (dpi, options, d_left (dc));
4798 return;
4800 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
4801 d_append_string (dpi, "covariant return thunk to ");
4802 d_print_comp (dpi, options, d_left (dc));
4803 return;
4805 case DEMANGLE_COMPONENT_JAVA_CLASS:
4806 d_append_string (dpi, "java Class for ");
4807 d_print_comp (dpi, options, d_left (dc));
4808 return;
4810 case DEMANGLE_COMPONENT_GUARD:
4811 d_append_string (dpi, "guard variable for ");
4812 d_print_comp (dpi, options, d_left (dc));
4813 return;
4815 case DEMANGLE_COMPONENT_TLS_INIT:
4816 d_append_string (dpi, "TLS init function for ");
4817 d_print_comp (dpi, options, d_left (dc));
4818 return;
4820 case DEMANGLE_COMPONENT_TLS_WRAPPER:
4821 d_append_string (dpi, "TLS wrapper function for ");
4822 d_print_comp (dpi, options, d_left (dc));
4823 return;
4825 case DEMANGLE_COMPONENT_REFTEMP:
4826 d_append_string (dpi, "reference temporary #");
4827 d_print_comp (dpi, options, d_right (dc));
4828 d_append_string (dpi, " for ");
4829 d_print_comp (dpi, options, d_left (dc));
4830 return;
4832 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
4833 d_append_string (dpi, "hidden alias for ");
4834 d_print_comp (dpi, options, d_left (dc));
4835 return;
4837 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
4838 d_append_string (dpi, "transaction clone for ");
4839 d_print_comp (dpi, options, d_left (dc));
4840 return;
4842 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
4843 d_append_string (dpi, "non-transaction clone for ");
4844 d_print_comp (dpi, options, d_left (dc));
4845 return;
4847 case DEMANGLE_COMPONENT_SUB_STD:
4848 d_append_buffer (dpi, dc->u.s_string.string, dc->u.s_string.len);
4849 return;
4851 case DEMANGLE_COMPONENT_RESTRICT:
4852 case DEMANGLE_COMPONENT_VOLATILE:
4853 case DEMANGLE_COMPONENT_CONST:
4855 struct d_print_mod *pdpm;
4857 /* When printing arrays, it's possible to have cases where the
4858 same CV-qualifier gets pushed on the stack multiple times.
4859 We only need to print it once. */
4861 for (pdpm = dpi->modifiers; pdpm != NULL; pdpm = pdpm->next)
4863 if (! pdpm->printed)
4865 if (pdpm->mod->type != DEMANGLE_COMPONENT_RESTRICT
4866 && pdpm->mod->type != DEMANGLE_COMPONENT_VOLATILE
4867 && pdpm->mod->type != DEMANGLE_COMPONENT_CONST)
4868 break;
4869 if (pdpm->mod->type == dc->type)
4871 d_print_comp (dpi, options, d_left (dc));
4872 return;
4877 goto modifier;
4879 case DEMANGLE_COMPONENT_REFERENCE:
4880 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
4882 /* Handle reference smashing: & + && = &. */
4883 const struct demangle_component *sub = d_left (dc);
4884 if (sub->type == DEMANGLE_COMPONENT_TEMPLATE_PARAM)
4886 struct d_saved_scope *scope = d_get_saved_scope (dpi, sub);
4887 struct demangle_component *a;
4889 if (scope == NULL)
4891 /* This is the first time SUB has been traversed.
4892 We need to capture the current templates so
4893 they can be restored if SUB is reentered as a
4894 substitution. */
4895 d_save_scope (dpi, sub);
4896 if (d_print_saw_error (dpi))
4897 return;
4899 else
4901 const struct d_component_stack *dcse;
4902 int found_self_or_parent = 0;
4904 /* This traversal is reentering SUB as a substition.
4905 If we are not beneath SUB or DC in the tree then we
4906 need to restore SUB's template stack temporarily. */
4907 for (dcse = dpi->component_stack; dcse != NULL;
4908 dcse = dcse->parent)
4910 if (dcse->dc == sub
4911 || (dcse->dc == dc
4912 && dcse != dpi->component_stack))
4914 found_self_or_parent = 1;
4915 break;
4919 if (!found_self_or_parent)
4921 saved_templates = dpi->templates;
4922 dpi->templates = scope->templates;
4923 need_template_restore = 1;
4927 a = d_lookup_template_argument (dpi, sub);
4928 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4929 a = d_index_template_argument (a, dpi->pack_index);
4931 if (a == NULL)
4933 if (need_template_restore)
4934 dpi->templates = saved_templates;
4936 d_print_error (dpi);
4937 return;
4940 sub = a;
4943 if (sub->type == DEMANGLE_COMPONENT_REFERENCE
4944 || sub->type == dc->type)
4945 dc = sub;
4946 else if (sub->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE)
4947 mod_inner = d_left (sub);
4949 /* Fall through. */
4951 case DEMANGLE_COMPONENT_RESTRICT_THIS:
4952 case DEMANGLE_COMPONENT_VOLATILE_THIS:
4953 case DEMANGLE_COMPONENT_CONST_THIS:
4954 case DEMANGLE_COMPONENT_REFERENCE_THIS:
4955 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
4956 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
4957 case DEMANGLE_COMPONENT_POINTER:
4958 case DEMANGLE_COMPONENT_COMPLEX:
4959 case DEMANGLE_COMPONENT_IMAGINARY:
4960 case DEMANGLE_COMPONENT_TRANSACTION_SAFE:
4961 modifier:
4963 /* We keep a list of modifiers on the stack. */
4964 struct d_print_mod dpm;
4966 dpm.next = dpi->modifiers;
4967 dpi->modifiers = &dpm;
4968 dpm.mod = dc;
4969 dpm.printed = 0;
4970 dpm.templates = dpi->templates;
4972 if (!mod_inner)
4973 mod_inner = d_left (dc);
4975 d_print_comp (dpi, options, mod_inner);
4977 /* If the modifier didn't get printed by the type, print it
4978 now. */
4979 if (! dpm.printed)
4980 d_print_mod (dpi, options, dc);
4982 dpi->modifiers = dpm.next;
4984 if (need_template_restore)
4985 dpi->templates = saved_templates;
4987 return;
4990 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
4991 if ((options & DMGL_JAVA) == 0)
4992 d_append_buffer (dpi, dc->u.s_builtin.type->name,
4993 dc->u.s_builtin.type->len);
4994 else
4995 d_append_buffer (dpi, dc->u.s_builtin.type->java_name,
4996 dc->u.s_builtin.type->java_len);
4997 return;
4999 case DEMANGLE_COMPONENT_VENDOR_TYPE:
5000 d_print_comp (dpi, options, d_left (dc));
5001 return;
5003 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
5005 if ((options & DMGL_RET_POSTFIX) != 0)
5006 d_print_function_type (dpi,
5007 options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
5008 dc, dpi->modifiers);
5010 /* Print return type if present */
5011 if (d_left (dc) != NULL && (options & DMGL_RET_POSTFIX) != 0)
5012 d_print_comp (dpi, options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
5013 d_left (dc));
5014 else if (d_left (dc) != NULL && (options & DMGL_RET_DROP) == 0)
5016 struct d_print_mod dpm;
5018 /* We must pass this type down as a modifier in order to
5019 print it in the right location. */
5020 dpm.next = dpi->modifiers;
5021 dpi->modifiers = &dpm;
5022 dpm.mod = dc;
5023 dpm.printed = 0;
5024 dpm.templates = dpi->templates;
5026 d_print_comp (dpi, options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
5027 d_left (dc));
5029 dpi->modifiers = dpm.next;
5031 if (dpm.printed)
5032 return;
5034 /* In standard prefix notation, there is a space between the
5035 return type and the function signature. */
5036 if ((options & DMGL_RET_POSTFIX) == 0)
5037 d_append_char (dpi, ' ');
5040 if ((options & DMGL_RET_POSTFIX) == 0)
5041 d_print_function_type (dpi,
5042 options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
5043 dc, dpi->modifiers);
5045 return;
5048 case DEMANGLE_COMPONENT_ARRAY_TYPE:
5050 struct d_print_mod *hold_modifiers;
5051 struct d_print_mod adpm[4];
5052 unsigned int i;
5053 struct d_print_mod *pdpm;
5055 /* We must pass this type down as a modifier in order to print
5056 multi-dimensional arrays correctly. If the array itself is
5057 CV-qualified, we act as though the element type were
5058 CV-qualified. We do this by copying the modifiers down
5059 rather than fiddling pointers, so that we don't wind up
5060 with a d_print_mod higher on the stack pointing into our
5061 stack frame after we return. */
5063 hold_modifiers = dpi->modifiers;
5065 adpm[0].next = hold_modifiers;
5066 dpi->modifiers = &adpm[0];
5067 adpm[0].mod = dc;
5068 adpm[0].printed = 0;
5069 adpm[0].templates = dpi->templates;
5071 i = 1;
5072 pdpm = hold_modifiers;
5073 while (pdpm != NULL
5074 && (pdpm->mod->type == DEMANGLE_COMPONENT_RESTRICT
5075 || pdpm->mod->type == DEMANGLE_COMPONENT_VOLATILE
5076 || pdpm->mod->type == DEMANGLE_COMPONENT_CONST))
5078 if (! pdpm->printed)
5080 if (i >= sizeof adpm / sizeof adpm[0])
5082 d_print_error (dpi);
5083 return;
5086 adpm[i] = *pdpm;
5087 adpm[i].next = dpi->modifiers;
5088 dpi->modifiers = &adpm[i];
5089 pdpm->printed = 1;
5090 ++i;
5093 pdpm = pdpm->next;
5096 d_print_comp (dpi, options, d_right (dc));
5098 dpi->modifiers = hold_modifiers;
5100 if (adpm[0].printed)
5101 return;
5103 while (i > 1)
5105 --i;
5106 d_print_mod (dpi, options, adpm[i].mod);
5109 d_print_array_type (dpi, options, dc, dpi->modifiers);
5111 return;
5114 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
5115 case DEMANGLE_COMPONENT_VECTOR_TYPE:
5117 struct d_print_mod dpm;
5119 dpm.next = dpi->modifiers;
5120 dpi->modifiers = &dpm;
5121 dpm.mod = dc;
5122 dpm.printed = 0;
5123 dpm.templates = dpi->templates;
5125 d_print_comp (dpi, options, d_right (dc));
5127 /* If the modifier didn't get printed by the type, print it
5128 now. */
5129 if (! dpm.printed)
5130 d_print_mod (dpi, options, dc);
5132 dpi->modifiers = dpm.next;
5134 return;
5137 case DEMANGLE_COMPONENT_FIXED_TYPE:
5138 if (dc->u.s_fixed.sat)
5139 d_append_string (dpi, "_Sat ");
5140 /* Don't print "int _Accum". */
5141 if (dc->u.s_fixed.length->u.s_builtin.type
5142 != &cplus_demangle_builtin_types['i'-'a'])
5144 d_print_comp (dpi, options, dc->u.s_fixed.length);
5145 d_append_char (dpi, ' ');
5147 if (dc->u.s_fixed.accum)
5148 d_append_string (dpi, "_Accum");
5149 else
5150 d_append_string (dpi, "_Fract");
5151 return;
5153 case DEMANGLE_COMPONENT_ARGLIST:
5154 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
5155 if (d_left (dc) != NULL)
5156 d_print_comp (dpi, options, d_left (dc));
5157 if (d_right (dc) != NULL)
5159 size_t len;
5160 unsigned long int flush_count;
5161 /* Make sure ", " isn't flushed by d_append_string, otherwise
5162 dpi->len -= 2 wouldn't work. */
5163 if (dpi->len >= sizeof (dpi->buf) - 2)
5164 d_print_flush (dpi);
5165 d_append_string (dpi, ", ");
5166 len = dpi->len;
5167 flush_count = dpi->flush_count;
5168 d_print_comp (dpi, options, d_right (dc));
5169 /* If that didn't print anything (which can happen with empty
5170 template argument packs), remove the comma and space. */
5171 if (dpi->flush_count == flush_count && dpi->len == len)
5172 dpi->len -= 2;
5174 return;
5176 case DEMANGLE_COMPONENT_INITIALIZER_LIST:
5178 struct demangle_component *type = d_left (dc);
5179 struct demangle_component *list = d_right (dc);
5181 if (type)
5182 d_print_comp (dpi, options, type);
5183 d_append_char (dpi, '{');
5184 d_print_comp (dpi, options, list);
5185 d_append_char (dpi, '}');
5187 return;
5189 case DEMANGLE_COMPONENT_OPERATOR:
5191 const struct demangle_operator_info *op = dc->u.s_operator.op;
5192 int len = op->len;
5194 d_append_string (dpi, "operator");
5195 /* Add a space before new/delete. */
5196 if (IS_LOWER (op->name[0]))
5197 d_append_char (dpi, ' ');
5198 /* Omit a trailing space. */
5199 if (op->name[len-1] == ' ')
5200 --len;
5201 d_append_buffer (dpi, op->name, len);
5202 return;
5205 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
5206 d_append_string (dpi, "operator ");
5207 d_print_comp (dpi, options, dc->u.s_extended_operator.name);
5208 return;
5210 case DEMANGLE_COMPONENT_CONVERSION:
5211 d_append_string (dpi, "operator ");
5212 d_print_conversion (dpi, options, dc);
5213 return;
5215 case DEMANGLE_COMPONENT_NULLARY:
5216 d_print_expr_op (dpi, options, d_left (dc));
5217 return;
5219 case DEMANGLE_COMPONENT_UNARY:
5221 struct demangle_component *op = d_left (dc);
5222 struct demangle_component *operand = d_right (dc);
5223 const char *code = NULL;
5225 if (op->type == DEMANGLE_COMPONENT_OPERATOR)
5227 code = op->u.s_operator.op->code;
5228 if (!strcmp (code, "ad"))
5230 /* Don't print the argument list for the address of a
5231 function. */
5232 if (operand->type == DEMANGLE_COMPONENT_TYPED_NAME
5233 && d_left (operand)->type == DEMANGLE_COMPONENT_QUAL_NAME
5234 && d_right (operand)->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
5235 operand = d_left (operand);
5237 if (operand->type == DEMANGLE_COMPONENT_BINARY_ARGS)
5239 /* This indicates a suffix operator. */
5240 operand = d_left (operand);
5241 d_print_subexpr (dpi, options, operand);
5242 d_print_expr_op (dpi, options, op);
5243 return;
5247 /* For sizeof..., just print the pack length. */
5248 if (code && !strcmp (code, "sZ"))
5250 struct demangle_component *a = d_find_pack (dpi, operand);
5251 int len = d_pack_length (a);
5252 d_append_num (dpi, len);
5253 return;
5255 else if (code && !strcmp (code, "sP"))
5257 int len = d_args_length (dpi, operand);
5258 d_append_num (dpi, len);
5259 return;
5262 if (op->type != DEMANGLE_COMPONENT_CAST)
5263 d_print_expr_op (dpi, options, op);
5264 else
5266 d_append_char (dpi, '(');
5267 d_print_cast (dpi, options, op);
5268 d_append_char (dpi, ')');
5270 if (code && !strcmp (code, "gs"))
5271 /* Avoid parens after '::'. */
5272 d_print_comp (dpi, options, operand);
5273 else if (code && !strcmp (code, "st"))
5274 /* Always print parens for sizeof (type). */
5276 d_append_char (dpi, '(');
5277 d_print_comp (dpi, options, operand);
5278 d_append_char (dpi, ')');
5280 else
5281 d_print_subexpr (dpi, options, operand);
5283 return;
5285 case DEMANGLE_COMPONENT_BINARY:
5286 if (d_right (dc)->type != DEMANGLE_COMPONENT_BINARY_ARGS)
5288 d_print_error (dpi);
5289 return;
5292 if (op_is_new_cast (d_left (dc)))
5294 d_print_expr_op (dpi, options, d_left (dc));
5295 d_append_char (dpi, '<');
5296 d_print_comp (dpi, options, d_left (d_right (dc)));
5297 d_append_string (dpi, ">(");
5298 d_print_comp (dpi, options, d_right (d_right (dc)));
5299 d_append_char (dpi, ')');
5300 return;
5303 if (d_maybe_print_fold_expression (dpi, options, dc))
5304 return;
5306 /* We wrap an expression which uses the greater-than operator in
5307 an extra layer of parens so that it does not get confused
5308 with the '>' which ends the template parameters. */
5309 if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
5310 && d_left (dc)->u.s_operator.op->len == 1
5311 && d_left (dc)->u.s_operator.op->name[0] == '>')
5312 d_append_char (dpi, '(');
5314 if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") == 0
5315 && d_left (d_right (dc))->type == DEMANGLE_COMPONENT_TYPED_NAME)
5317 /* Function call used in an expression should not have printed types
5318 of the function arguments. Values of the function arguments still
5319 get printed below. */
5321 const struct demangle_component *func = d_left (d_right (dc));
5323 if (d_right (func)->type != DEMANGLE_COMPONENT_FUNCTION_TYPE)
5324 d_print_error (dpi);
5325 d_print_subexpr (dpi, options, d_left (func));
5327 else
5328 d_print_subexpr (dpi, options, d_left (d_right (dc)));
5329 if (strcmp (d_left (dc)->u.s_operator.op->code, "ix") == 0)
5331 d_append_char (dpi, '[');
5332 d_print_comp (dpi, options, d_right (d_right (dc)));
5333 d_append_char (dpi, ']');
5335 else
5337 if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") != 0)
5338 d_print_expr_op (dpi, options, d_left (dc));
5339 d_print_subexpr (dpi, options, d_right (d_right (dc)));
5342 if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
5343 && d_left (dc)->u.s_operator.op->len == 1
5344 && d_left (dc)->u.s_operator.op->name[0] == '>')
5345 d_append_char (dpi, ')');
5347 return;
5349 case DEMANGLE_COMPONENT_BINARY_ARGS:
5350 /* We should only see this as part of DEMANGLE_COMPONENT_BINARY. */
5351 d_print_error (dpi);
5352 return;
5354 case DEMANGLE_COMPONENT_TRINARY:
5355 if (d_right (dc)->type != DEMANGLE_COMPONENT_TRINARY_ARG1
5356 || d_right (d_right (dc))->type != DEMANGLE_COMPONENT_TRINARY_ARG2)
5358 d_print_error (dpi);
5359 return;
5361 if (d_maybe_print_fold_expression (dpi, options, dc))
5362 return;
5364 struct demangle_component *op = d_left (dc);
5365 struct demangle_component *first = d_left (d_right (dc));
5366 struct demangle_component *second = d_left (d_right (d_right (dc)));
5367 struct demangle_component *third = d_right (d_right (d_right (dc)));
5369 if (!strcmp (op->u.s_operator.op->code, "qu"))
5371 d_print_subexpr (dpi, options, first);
5372 d_print_expr_op (dpi, options, op);
5373 d_print_subexpr (dpi, options, second);
5374 d_append_string (dpi, " : ");
5375 d_print_subexpr (dpi, options, third);
5377 else
5379 d_append_string (dpi, "new ");
5380 if (d_left (first) != NULL)
5382 d_print_subexpr (dpi, options, first);
5383 d_append_char (dpi, ' ');
5385 d_print_comp (dpi, options, second);
5386 if (third)
5387 d_print_subexpr (dpi, options, third);
5390 return;
5392 case DEMANGLE_COMPONENT_TRINARY_ARG1:
5393 case DEMANGLE_COMPONENT_TRINARY_ARG2:
5394 /* We should only see these are part of DEMANGLE_COMPONENT_TRINARY. */
5395 d_print_error (dpi);
5396 return;
5398 case DEMANGLE_COMPONENT_LITERAL:
5399 case DEMANGLE_COMPONENT_LITERAL_NEG:
5401 enum d_builtin_type_print tp;
5403 /* For some builtin types, produce simpler output. */
5404 tp = D_PRINT_DEFAULT;
5405 if (d_left (dc)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE)
5407 tp = d_left (dc)->u.s_builtin.type->print;
5408 switch (tp)
5410 case D_PRINT_INT:
5411 case D_PRINT_UNSIGNED:
5412 case D_PRINT_LONG:
5413 case D_PRINT_UNSIGNED_LONG:
5414 case D_PRINT_LONG_LONG:
5415 case D_PRINT_UNSIGNED_LONG_LONG:
5416 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME)
5418 if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
5419 d_append_char (dpi, '-');
5420 d_print_comp (dpi, options, d_right (dc));
5421 switch (tp)
5423 default:
5424 break;
5425 case D_PRINT_UNSIGNED:
5426 d_append_char (dpi, 'u');
5427 break;
5428 case D_PRINT_LONG:
5429 d_append_char (dpi, 'l');
5430 break;
5431 case D_PRINT_UNSIGNED_LONG:
5432 d_append_string (dpi, "ul");
5433 break;
5434 case D_PRINT_LONG_LONG:
5435 d_append_string (dpi, "ll");
5436 break;
5437 case D_PRINT_UNSIGNED_LONG_LONG:
5438 d_append_string (dpi, "ull");
5439 break;
5441 return;
5443 break;
5445 case D_PRINT_BOOL:
5446 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME
5447 && d_right (dc)->u.s_name.len == 1
5448 && dc->type == DEMANGLE_COMPONENT_LITERAL)
5450 switch (d_right (dc)->u.s_name.s[0])
5452 case '0':
5453 d_append_string (dpi, "false");
5454 return;
5455 case '1':
5456 d_append_string (dpi, "true");
5457 return;
5458 default:
5459 break;
5462 break;
5464 default:
5465 break;
5469 d_append_char (dpi, '(');
5470 d_print_comp (dpi, options, d_left (dc));
5471 d_append_char (dpi, ')');
5472 if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
5473 d_append_char (dpi, '-');
5474 if (tp == D_PRINT_FLOAT)
5475 d_append_char (dpi, '[');
5476 d_print_comp (dpi, options, d_right (dc));
5477 if (tp == D_PRINT_FLOAT)
5478 d_append_char (dpi, ']');
5480 return;
5482 case DEMANGLE_COMPONENT_NUMBER:
5483 d_append_num (dpi, dc->u.s_number.number);
5484 return;
5486 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
5487 d_append_string (dpi, "java resource ");
5488 d_print_comp (dpi, options, d_left (dc));
5489 return;
5491 case DEMANGLE_COMPONENT_COMPOUND_NAME:
5492 d_print_comp (dpi, options, d_left (dc));
5493 d_print_comp (dpi, options, d_right (dc));
5494 return;
5496 case DEMANGLE_COMPONENT_CHARACTER:
5497 d_append_char (dpi, dc->u.s_character.character);
5498 return;
5500 case DEMANGLE_COMPONENT_DECLTYPE:
5501 d_append_string (dpi, "decltype (");
5502 d_print_comp (dpi, options, d_left (dc));
5503 d_append_char (dpi, ')');
5504 return;
5506 case DEMANGLE_COMPONENT_PACK_EXPANSION:
5508 int len;
5509 int i;
5510 struct demangle_component *a = d_find_pack (dpi, d_left (dc));
5511 if (a == NULL)
5513 /* d_find_pack won't find anything if the only packs involved
5514 in this expansion are function parameter packs; in that
5515 case, just print the pattern and "...". */
5516 d_print_subexpr (dpi, options, d_left (dc));
5517 d_append_string (dpi, "...");
5518 return;
5521 len = d_pack_length (a);
5522 dc = d_left (dc);
5523 for (i = 0; i < len; ++i)
5525 dpi->pack_index = i;
5526 d_print_comp (dpi, options, dc);
5527 if (i < len-1)
5528 d_append_string (dpi, ", ");
5531 return;
5533 case DEMANGLE_COMPONENT_FUNCTION_PARAM:
5535 long num = dc->u.s_number.number;
5536 if (num == 0)
5537 d_append_string (dpi, "this");
5538 else
5540 d_append_string (dpi, "{parm#");
5541 d_append_num (dpi, num);
5542 d_append_char (dpi, '}');
5545 return;
5547 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
5548 d_append_string (dpi, "global constructors keyed to ");
5549 d_print_comp (dpi, options, dc->u.s_binary.left);
5550 return;
5552 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
5553 d_append_string (dpi, "global destructors keyed to ");
5554 d_print_comp (dpi, options, dc->u.s_binary.left);
5555 return;
5557 case DEMANGLE_COMPONENT_LAMBDA:
5558 d_append_string (dpi, "{lambda(");
5559 d_print_comp (dpi, options, dc->u.s_unary_num.sub);
5560 d_append_string (dpi, ")#");
5561 d_append_num (dpi, dc->u.s_unary_num.num + 1);
5562 d_append_char (dpi, '}');
5563 return;
5565 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
5566 d_append_string (dpi, "{unnamed type#");
5567 d_append_num (dpi, dc->u.s_number.number + 1);
5568 d_append_char (dpi, '}');
5569 return;
5571 case DEMANGLE_COMPONENT_CLONE:
5572 d_print_comp (dpi, options, d_left (dc));
5573 d_append_string (dpi, " [clone ");
5574 d_print_comp (dpi, options, d_right (dc));
5575 d_append_char (dpi, ']');
5576 return;
5578 default:
5579 d_print_error (dpi);
5580 return;
5584 static void
5585 d_print_comp (struct d_print_info *dpi, int options,
5586 const struct demangle_component *dc)
5588 struct d_component_stack self;
5590 self.dc = dc;
5591 self.parent = dpi->component_stack;
5592 dpi->component_stack = &self;
5594 d_print_comp_inner (dpi, options, dc);
5596 dpi->component_stack = self.parent;
5599 /* Print a Java dentifier. For Java we try to handle encoded extended
5600 Unicode characters. The C++ ABI doesn't mention Unicode encoding,
5601 so we don't it for C++. Characters are encoded as
5602 __U<hex-char>+_. */
5604 static void
5605 d_print_java_identifier (struct d_print_info *dpi, const char *name, int len)
5607 const char *p;
5608 const char *end;
5610 end = name + len;
5611 for (p = name; p < end; ++p)
5613 if (end - p > 3
5614 && p[0] == '_'
5615 && p[1] == '_'
5616 && p[2] == 'U')
5618 unsigned long c;
5619 const char *q;
5621 c = 0;
5622 for (q = p + 3; q < end; ++q)
5624 int dig;
5626 if (IS_DIGIT (*q))
5627 dig = *q - '0';
5628 else if (*q >= 'A' && *q <= 'F')
5629 dig = *q - 'A' + 10;
5630 else if (*q >= 'a' && *q <= 'f')
5631 dig = *q - 'a' + 10;
5632 else
5633 break;
5635 c = c * 16 + dig;
5637 /* If the Unicode character is larger than 256, we don't try
5638 to deal with it here. FIXME. */
5639 if (q < end && *q == '_' && c < 256)
5641 d_append_char (dpi, c);
5642 p = q;
5643 continue;
5647 d_append_char (dpi, *p);
5651 /* Print a list of modifiers. SUFFIX is 1 if we are printing
5652 qualifiers on this after printing a function. */
5654 static void
5655 d_print_mod_list (struct d_print_info *dpi, int options,
5656 struct d_print_mod *mods, int suffix)
5658 struct d_print_template *hold_dpt;
5660 if (mods == NULL || d_print_saw_error (dpi))
5661 return;
5663 if (mods->printed
5664 || (! suffix
5665 && (mods->mod->type == DEMANGLE_COMPONENT_RESTRICT_THIS
5666 || mods->mod->type == DEMANGLE_COMPONENT_VOLATILE_THIS
5667 || mods->mod->type == DEMANGLE_COMPONENT_CONST_THIS
5668 || mods->mod->type == DEMANGLE_COMPONENT_REFERENCE_THIS
5669 || mods->mod->type == DEMANGLE_COMPONENT_TRANSACTION_SAFE
5670 || (mods->mod->type
5671 == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS))))
5673 d_print_mod_list (dpi, options, mods->next, suffix);
5674 return;
5677 mods->printed = 1;
5679 hold_dpt = dpi->templates;
5680 dpi->templates = mods->templates;
5682 if (mods->mod->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
5684 d_print_function_type (dpi, options, mods->mod, mods->next);
5685 dpi->templates = hold_dpt;
5686 return;
5688 else if (mods->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
5690 d_print_array_type (dpi, options, mods->mod, mods->next);
5691 dpi->templates = hold_dpt;
5692 return;
5694 else if (mods->mod->type == DEMANGLE_COMPONENT_LOCAL_NAME)
5696 struct d_print_mod *hold_modifiers;
5697 struct demangle_component *dc;
5699 /* When this is on the modifier stack, we have pulled any
5700 qualifiers off the right argument already. Otherwise, we
5701 print it as usual, but don't let the left argument see any
5702 modifiers. */
5704 hold_modifiers = dpi->modifiers;
5705 dpi->modifiers = NULL;
5706 d_print_comp (dpi, options, d_left (mods->mod));
5707 dpi->modifiers = hold_modifiers;
5709 if ((options & DMGL_JAVA) == 0)
5710 d_append_string (dpi, "::");
5711 else
5712 d_append_char (dpi, '.');
5714 dc = d_right (mods->mod);
5716 if (dc->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
5718 d_append_string (dpi, "{default arg#");
5719 d_append_num (dpi, dc->u.s_unary_num.num + 1);
5720 d_append_string (dpi, "}::");
5721 dc = dc->u.s_unary_num.sub;
5724 while (dc->type == DEMANGLE_COMPONENT_RESTRICT_THIS
5725 || dc->type == DEMANGLE_COMPONENT_VOLATILE_THIS
5726 || dc->type == DEMANGLE_COMPONENT_CONST_THIS
5727 || dc->type == DEMANGLE_COMPONENT_REFERENCE_THIS
5728 || dc->type == DEMANGLE_COMPONENT_TRANSACTION_SAFE
5729 || dc->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS)
5730 dc = d_left (dc);
5732 d_print_comp (dpi, options, dc);
5734 dpi->templates = hold_dpt;
5735 return;
5738 d_print_mod (dpi, options, mods->mod);
5740 dpi->templates = hold_dpt;
5742 d_print_mod_list (dpi, options, mods->next, suffix);
5745 /* Print a modifier. */
5747 static void
5748 d_print_mod (struct d_print_info *dpi, int options,
5749 const struct demangle_component *mod)
5751 switch (mod->type)
5753 case DEMANGLE_COMPONENT_RESTRICT:
5754 case DEMANGLE_COMPONENT_RESTRICT_THIS:
5755 d_append_string (dpi, " restrict");
5756 return;
5757 case DEMANGLE_COMPONENT_VOLATILE:
5758 case DEMANGLE_COMPONENT_VOLATILE_THIS:
5759 d_append_string (dpi, " volatile");
5760 return;
5761 case DEMANGLE_COMPONENT_CONST:
5762 case DEMANGLE_COMPONENT_CONST_THIS:
5763 d_append_string (dpi, " const");
5764 return;
5765 case DEMANGLE_COMPONENT_TRANSACTION_SAFE:
5766 d_append_string (dpi, " transaction_safe");
5767 return;
5768 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
5769 d_append_char (dpi, ' ');
5770 d_print_comp (dpi, options, d_right (mod));
5771 return;
5772 case DEMANGLE_COMPONENT_POINTER:
5773 /* There is no pointer symbol in Java. */
5774 if ((options & DMGL_JAVA) == 0)
5775 d_append_char (dpi, '*');
5776 return;
5777 case DEMANGLE_COMPONENT_REFERENCE_THIS:
5778 /* For the ref-qualifier, put a space before the &. */
5779 d_append_char (dpi, ' ');
5780 /* FALLTHRU */
5781 case DEMANGLE_COMPONENT_REFERENCE:
5782 d_append_char (dpi, '&');
5783 return;
5784 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
5785 d_append_char (dpi, ' ');
5786 /* FALLTHRU */
5787 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
5788 d_append_string (dpi, "&&");
5789 return;
5790 case DEMANGLE_COMPONENT_COMPLEX:
5791 d_append_string (dpi, "complex ");
5792 return;
5793 case DEMANGLE_COMPONENT_IMAGINARY:
5794 d_append_string (dpi, "imaginary ");
5795 return;
5796 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
5797 if (d_last_char (dpi) != '(')
5798 d_append_char (dpi, ' ');
5799 d_print_comp (dpi, options, d_left (mod));
5800 d_append_string (dpi, "::*");
5801 return;
5802 case DEMANGLE_COMPONENT_TYPED_NAME:
5803 d_print_comp (dpi, options, d_left (mod));
5804 return;
5805 case DEMANGLE_COMPONENT_VECTOR_TYPE:
5806 d_append_string (dpi, " __vector(");
5807 d_print_comp (dpi, options, d_left (mod));
5808 d_append_char (dpi, ')');
5809 return;
5811 default:
5812 /* Otherwise, we have something that won't go back on the
5813 modifier stack, so we can just print it. */
5814 d_print_comp (dpi, options, mod);
5815 return;
5819 /* Print a function type, except for the return type. */
5821 static void
5822 d_print_function_type (struct d_print_info *dpi, int options,
5823 const struct demangle_component *dc,
5824 struct d_print_mod *mods)
5826 int need_paren;
5827 int need_space;
5828 struct d_print_mod *p;
5829 struct d_print_mod *hold_modifiers;
5831 need_paren = 0;
5832 need_space = 0;
5833 for (p = mods; p != NULL; p = p->next)
5835 if (p->printed)
5836 break;
5838 switch (p->mod->type)
5840 case DEMANGLE_COMPONENT_POINTER:
5841 case DEMANGLE_COMPONENT_REFERENCE:
5842 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
5843 need_paren = 1;
5844 break;
5845 case DEMANGLE_COMPONENT_RESTRICT:
5846 case DEMANGLE_COMPONENT_VOLATILE:
5847 case DEMANGLE_COMPONENT_CONST:
5848 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
5849 case DEMANGLE_COMPONENT_COMPLEX:
5850 case DEMANGLE_COMPONENT_IMAGINARY:
5851 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
5852 need_space = 1;
5853 need_paren = 1;
5854 break;
5855 case DEMANGLE_COMPONENT_RESTRICT_THIS:
5856 case DEMANGLE_COMPONENT_VOLATILE_THIS:
5857 case DEMANGLE_COMPONENT_CONST_THIS:
5858 case DEMANGLE_COMPONENT_REFERENCE_THIS:
5859 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
5860 case DEMANGLE_COMPONENT_TRANSACTION_SAFE:
5861 break;
5862 default:
5863 break;
5865 if (need_paren)
5866 break;
5869 if (need_paren)
5871 if (! need_space)
5873 if (d_last_char (dpi) != '('
5874 && d_last_char (dpi) != '*')
5875 need_space = 1;
5877 if (need_space && d_last_char (dpi) != ' ')
5878 d_append_char (dpi, ' ');
5879 d_append_char (dpi, '(');
5882 hold_modifiers = dpi->modifiers;
5883 dpi->modifiers = NULL;
5885 d_print_mod_list (dpi, options, mods, 0);
5887 if (need_paren)
5888 d_append_char (dpi, ')');
5890 d_append_char (dpi, '(');
5892 if (d_right (dc) != NULL)
5893 d_print_comp (dpi, options, d_right (dc));
5895 d_append_char (dpi, ')');
5897 d_print_mod_list (dpi, options, mods, 1);
5899 dpi->modifiers = hold_modifiers;
5902 /* Print an array type, except for the element type. */
5904 static void
5905 d_print_array_type (struct d_print_info *dpi, int options,
5906 const struct demangle_component *dc,
5907 struct d_print_mod *mods)
5909 int need_space;
5911 need_space = 1;
5912 if (mods != NULL)
5914 int need_paren;
5915 struct d_print_mod *p;
5917 need_paren = 0;
5918 for (p = mods; p != NULL; p = p->next)
5920 if (! p->printed)
5922 if (p->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
5924 need_space = 0;
5925 break;
5927 else
5929 need_paren = 1;
5930 need_space = 1;
5931 break;
5936 if (need_paren)
5937 d_append_string (dpi, " (");
5939 d_print_mod_list (dpi, options, mods, 0);
5941 if (need_paren)
5942 d_append_char (dpi, ')');
5945 if (need_space)
5946 d_append_char (dpi, ' ');
5948 d_append_char (dpi, '[');
5950 if (d_left (dc) != NULL)
5951 d_print_comp (dpi, options, d_left (dc));
5953 d_append_char (dpi, ']');
5956 /* Print an operator in an expression. */
5958 static void
5959 d_print_expr_op (struct d_print_info *dpi, int options,
5960 const struct demangle_component *dc)
5962 if (dc->type == DEMANGLE_COMPONENT_OPERATOR)
5963 d_append_buffer (dpi, dc->u.s_operator.op->name,
5964 dc->u.s_operator.op->len);
5965 else
5966 d_print_comp (dpi, options, dc);
5969 /* Print a cast. */
5971 static void
5972 d_print_cast (struct d_print_info *dpi, int options,
5973 const struct demangle_component *dc)
5975 d_print_comp (dpi, options, d_left (dc));
5978 /* Print a conversion operator. */
5980 static void
5981 d_print_conversion (struct d_print_info *dpi, int options,
5982 const struct demangle_component *dc)
5984 struct d_print_template dpt;
5986 /* For a conversion operator, we need the template parameters from
5987 the enclosing template in scope for processing the type. */
5988 if (dpi->current_template != NULL)
5990 dpt.next = dpi->templates;
5991 dpi->templates = &dpt;
5992 dpt.template_decl = dpi->current_template;
5995 if (d_left (dc)->type != DEMANGLE_COMPONENT_TEMPLATE)
5997 d_print_comp (dpi, options, d_left (dc));
5998 if (dpi->current_template != NULL)
5999 dpi->templates = dpt.next;
6001 else
6003 d_print_comp (dpi, options, d_left (d_left (dc)));
6005 /* For a templated cast operator, we need to remove the template
6006 parameters from scope after printing the operator name,
6007 so we need to handle the template printing here. */
6008 if (dpi->current_template != NULL)
6009 dpi->templates = dpt.next;
6011 if (d_last_char (dpi) == '<')
6012 d_append_char (dpi, ' ');
6013 d_append_char (dpi, '<');
6014 d_print_comp (dpi, options, d_right (d_left (dc)));
6015 /* Avoid generating two consecutive '>' characters, to avoid
6016 the C++ syntactic ambiguity. */
6017 if (d_last_char (dpi) == '>')
6018 d_append_char (dpi, ' ');
6019 d_append_char (dpi, '>');
6023 /* Initialize the information structure we use to pass around
6024 information. */
6026 CP_STATIC_IF_GLIBCPP_V3
6027 void
6028 cplus_demangle_init_info (const char *mangled, int options, size_t len,
6029 struct d_info *di)
6031 di->s = mangled;
6032 di->send = mangled + len;
6033 di->options = options;
6035 di->n = mangled;
6037 /* We can not need more components than twice the number of chars in
6038 the mangled string. Most components correspond directly to
6039 chars, but the ARGLIST types are exceptions. */
6040 di->num_comps = 2 * len;
6041 di->next_comp = 0;
6043 /* Similarly, we can not need more substitutions than there are
6044 chars in the mangled string. */
6045 di->num_subs = len;
6046 di->next_sub = 0;
6047 di->did_subs = 0;
6049 di->last_name = NULL;
6051 di->expansion = 0;
6052 di->is_expression = 0;
6053 di->is_conversion = 0;
6056 /* Internal implementation for the demangler. If MANGLED is a g++ v3 ABI
6057 mangled name, return strings in repeated callback giving the demangled
6058 name. OPTIONS is the usual libiberty demangler options. On success,
6059 this returns 1. On failure, returns 0. */
6061 static int
6062 d_demangle_callback (const char *mangled, int options,
6063 demangle_callbackref callback, void *opaque)
6065 enum
6067 DCT_TYPE,
6068 DCT_MANGLED,
6069 DCT_GLOBAL_CTORS,
6070 DCT_GLOBAL_DTORS
6072 type;
6073 struct d_info di;
6074 struct demangle_component *dc;
6075 int status;
6077 if (mangled[0] == '_' && mangled[1] == 'Z')
6078 type = DCT_MANGLED;
6079 else if (strncmp (mangled, "_GLOBAL_", 8) == 0
6080 && (mangled[8] == '.' || mangled[8] == '_' || mangled[8] == '$')
6081 && (mangled[9] == 'D' || mangled[9] == 'I')
6082 && mangled[10] == '_')
6083 type = mangled[9] == 'I' ? DCT_GLOBAL_CTORS : DCT_GLOBAL_DTORS;
6084 else
6086 if ((options & DMGL_TYPES) == 0)
6087 return 0;
6088 type = DCT_TYPE;
6091 cplus_demangle_init_info (mangled, options, strlen (mangled), &di);
6094 #ifdef CP_DYNAMIC_ARRAYS
6095 __extension__ struct demangle_component comps[di.num_comps];
6096 __extension__ struct demangle_component *subs[di.num_subs];
6098 di.comps = comps;
6099 di.subs = subs;
6100 #else
6101 di.comps = alloca (di.num_comps * sizeof (*di.comps));
6102 di.subs = alloca (di.num_subs * sizeof (*di.subs));
6103 #endif
6105 switch (type)
6107 case DCT_TYPE:
6108 dc = cplus_demangle_type (&di);
6109 break;
6110 case DCT_MANGLED:
6111 dc = cplus_demangle_mangled_name (&di, 1);
6112 break;
6113 case DCT_GLOBAL_CTORS:
6114 case DCT_GLOBAL_DTORS:
6115 d_advance (&di, 11);
6116 dc = d_make_comp (&di,
6117 (type == DCT_GLOBAL_CTORS
6118 ? DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
6119 : DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS),
6120 d_make_demangle_mangled_name (&di, d_str (&di)),
6121 NULL);
6122 d_advance (&di, strlen (d_str (&di)));
6123 break;
6124 default:
6125 abort (); /* We have listed all the cases. */
6128 /* If DMGL_PARAMS is set, then if we didn't consume the entire
6129 mangled string, then we didn't successfully demangle it. If
6130 DMGL_PARAMS is not set, we didn't look at the trailing
6131 parameters. */
6132 if (((options & DMGL_PARAMS) != 0) && d_peek_char (&di) != '\0')
6133 dc = NULL;
6135 #ifdef CP_DEMANGLE_DEBUG
6136 d_dump (dc, 0);
6137 #endif
6139 status = (dc != NULL)
6140 ? cplus_demangle_print_callback (options, dc, callback, opaque)
6141 : 0;
6144 return status;
6147 /* Entry point for the demangler. If MANGLED is a g++ v3 ABI mangled
6148 name, return a buffer allocated with malloc holding the demangled
6149 name. OPTIONS is the usual libiberty demangler options. On
6150 success, this sets *PALC to the allocated size of the returned
6151 buffer. On failure, this sets *PALC to 0 for a bad name, or 1 for
6152 a memory allocation failure, and returns NULL. */
6154 static char *
6155 d_demangle (const char *mangled, int options, size_t *palc)
6157 struct d_growable_string dgs;
6158 int status;
6160 d_growable_string_init (&dgs, 0);
6162 status = d_demangle_callback (mangled, options,
6163 d_growable_string_callback_adapter, &dgs);
6164 if (status == 0)
6166 free (dgs.buf);
6167 *palc = 0;
6168 return NULL;
6171 *palc = dgs.allocation_failure ? 1 : dgs.alc;
6172 return dgs.buf;
6175 #if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3)
6177 extern char *__cxa_demangle (const char *, char *, size_t *, int *);
6179 /* ia64 ABI-mandated entry point in the C++ runtime library for
6180 performing demangling. MANGLED_NAME is a NUL-terminated character
6181 string containing the name to be demangled.
6183 OUTPUT_BUFFER is a region of memory, allocated with malloc, of
6184 *LENGTH bytes, into which the demangled name is stored. If
6185 OUTPUT_BUFFER is not long enough, it is expanded using realloc.
6186 OUTPUT_BUFFER may instead be NULL; in that case, the demangled name
6187 is placed in a region of memory allocated with malloc.
6189 If LENGTH is non-NULL, the length of the buffer containing the
6190 demangled name, is placed in *LENGTH.
6192 The return value is a pointer to the start of the NUL-terminated
6193 demangled name, or NULL if the demangling fails. The caller is
6194 responsible for deallocating this memory using free.
6196 *STATUS is set to one of the following values:
6197 0: The demangling operation succeeded.
6198 -1: A memory allocation failure occurred.
6199 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
6200 -3: One of the arguments is invalid.
6202 The demangling is performed using the C++ ABI mangling rules, with
6203 GNU extensions. */
6205 char *
6206 __cxa_demangle (const char *mangled_name, char *output_buffer,
6207 size_t *length, int *status)
6209 char *demangled;
6210 size_t alc;
6212 if (mangled_name == NULL)
6214 if (status != NULL)
6215 *status = -3;
6216 return NULL;
6219 if (output_buffer != NULL && length == NULL)
6221 if (status != NULL)
6222 *status = -3;
6223 return NULL;
6226 demangled = d_demangle (mangled_name, DMGL_PARAMS | DMGL_TYPES, &alc);
6228 if (demangled == NULL)
6230 if (status != NULL)
6232 if (alc == 1)
6233 *status = -1;
6234 else
6235 *status = -2;
6237 return NULL;
6240 if (output_buffer == NULL)
6242 if (length != NULL)
6243 *length = alc;
6245 else
6247 if (strlen (demangled) < *length)
6249 strcpy (output_buffer, demangled);
6250 free (demangled);
6251 demangled = output_buffer;
6253 else
6255 free (output_buffer);
6256 *length = alc;
6260 if (status != NULL)
6261 *status = 0;
6263 return demangled;
6266 extern int __gcclibcxx_demangle_callback (const char *,
6267 void (*)
6268 (const char *, size_t, void *),
6269 void *);
6271 /* Alternative, allocationless entry point in the C++ runtime library
6272 for performing demangling. MANGLED_NAME is a NUL-terminated character
6273 string containing the name to be demangled.
6275 CALLBACK is a callback function, called with demangled string
6276 segments as demangling progresses; it is called at least once,
6277 but may be called more than once. OPAQUE is a generalized pointer
6278 used as a callback argument.
6280 The return code is one of the following values, equivalent to
6281 the STATUS values of __cxa_demangle() (excluding -1, since this
6282 function performs no memory allocations):
6283 0: The demangling operation succeeded.
6284 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
6285 -3: One of the arguments is invalid.
6287 The demangling is performed using the C++ ABI mangling rules, with
6288 GNU extensions. */
6291 __gcclibcxx_demangle_callback (const char *mangled_name,
6292 void (*callback) (const char *, size_t, void *),
6293 void *opaque)
6295 int status;
6297 if (mangled_name == NULL || callback == NULL)
6298 return -3;
6300 status = d_demangle_callback (mangled_name, DMGL_PARAMS | DMGL_TYPES,
6301 callback, opaque);
6302 if (status == 0)
6303 return -2;
6305 return 0;
6308 #else /* ! (IN_LIBGCC2 || IN_GLIBCPP_V3) */
6310 /* Entry point for libiberty demangler. If MANGLED is a g++ v3 ABI
6311 mangled name, return a buffer allocated with malloc holding the
6312 demangled name. Otherwise, return NULL. */
6314 char *
6315 cplus_demangle_v3 (const char *mangled, int options)
6317 size_t alc;
6319 return d_demangle (mangled, options, &alc);
6323 cplus_demangle_v3_callback (const char *mangled, int options,
6324 demangle_callbackref callback, void *opaque)
6326 return d_demangle_callback (mangled, options, callback, opaque);
6329 /* Demangle a Java symbol. Java uses a subset of the V3 ABI C++ mangling
6330 conventions, but the output formatting is a little different.
6331 This instructs the C++ demangler not to emit pointer characters ("*"), to
6332 use Java's namespace separator symbol ("." instead of "::"), and to output
6333 JArray<TYPE> as TYPE[]. */
6335 char *
6336 java_demangle_v3 (const char *mangled)
6338 size_t alc;
6340 return d_demangle (mangled, DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX, &alc);
6344 java_demangle_v3_callback (const char *mangled,
6345 demangle_callbackref callback, void *opaque)
6347 return d_demangle_callback (mangled,
6348 DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX,
6349 callback, opaque);
6352 #endif /* IN_LIBGCC2 || IN_GLIBCPP_V3 */
6354 #ifndef IN_GLIBCPP_V3
6356 /* Demangle a string in order to find out whether it is a constructor
6357 or destructor. Return non-zero on success. Set *CTOR_KIND and
6358 *DTOR_KIND appropriately. */
6360 static int
6361 is_ctor_or_dtor (const char *mangled,
6362 enum gnu_v3_ctor_kinds *ctor_kind,
6363 enum gnu_v3_dtor_kinds *dtor_kind)
6365 struct d_info di;
6366 struct demangle_component *dc;
6367 int ret;
6369 *ctor_kind = (enum gnu_v3_ctor_kinds) 0;
6370 *dtor_kind = (enum gnu_v3_dtor_kinds) 0;
6372 cplus_demangle_init_info (mangled, DMGL_GNU_V3, strlen (mangled), &di);
6375 #ifdef CP_DYNAMIC_ARRAYS
6376 __extension__ struct demangle_component comps[di.num_comps];
6377 __extension__ struct demangle_component *subs[di.num_subs];
6379 di.comps = comps;
6380 di.subs = subs;
6381 #else
6382 di.comps = alloca (di.num_comps * sizeof (*di.comps));
6383 di.subs = alloca (di.num_subs * sizeof (*di.subs));
6384 #endif
6386 dc = cplus_demangle_mangled_name (&di, 1);
6388 /* Note that because we did not pass DMGL_PARAMS, we don't expect
6389 to demangle the entire string. */
6391 ret = 0;
6392 while (dc != NULL)
6394 switch (dc->type)
6396 /* These cannot appear on a constructor or destructor. */
6397 case DEMANGLE_COMPONENT_RESTRICT_THIS:
6398 case DEMANGLE_COMPONENT_VOLATILE_THIS:
6399 case DEMANGLE_COMPONENT_CONST_THIS:
6400 case DEMANGLE_COMPONENT_REFERENCE_THIS:
6401 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
6402 case DEMANGLE_COMPONENT_TRANSACTION_SAFE:
6403 default:
6404 dc = NULL;
6405 break;
6406 case DEMANGLE_COMPONENT_TYPED_NAME:
6407 case DEMANGLE_COMPONENT_TEMPLATE:
6408 dc = d_left (dc);
6409 break;
6410 case DEMANGLE_COMPONENT_QUAL_NAME:
6411 case DEMANGLE_COMPONENT_LOCAL_NAME:
6412 dc = d_right (dc);
6413 break;
6414 case DEMANGLE_COMPONENT_CTOR:
6415 *ctor_kind = dc->u.s_ctor.kind;
6416 ret = 1;
6417 dc = NULL;
6418 break;
6419 case DEMANGLE_COMPONENT_DTOR:
6420 *dtor_kind = dc->u.s_dtor.kind;
6421 ret = 1;
6422 dc = NULL;
6423 break;
6428 return ret;
6431 /* Return whether NAME is the mangled form of a g++ V3 ABI constructor
6432 name. A non-zero return indicates the type of constructor. */
6434 enum gnu_v3_ctor_kinds
6435 is_gnu_v3_mangled_ctor (const char *name)
6437 enum gnu_v3_ctor_kinds ctor_kind;
6438 enum gnu_v3_dtor_kinds dtor_kind;
6440 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
6441 return (enum gnu_v3_ctor_kinds) 0;
6442 return ctor_kind;
6446 /* Return whether NAME is the mangled form of a g++ V3 ABI destructor
6447 name. A non-zero return indicates the type of destructor. */
6449 enum gnu_v3_dtor_kinds
6450 is_gnu_v3_mangled_dtor (const char *name)
6452 enum gnu_v3_ctor_kinds ctor_kind;
6453 enum gnu_v3_dtor_kinds dtor_kind;
6455 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
6456 return (enum gnu_v3_dtor_kinds) 0;
6457 return dtor_kind;
6460 #endif /* IN_GLIBCPP_V3 */
6462 #ifdef STANDALONE_DEMANGLER
6464 #include "getopt.h"
6465 #include "dyn-string.h"
6467 static void print_usage (FILE* fp, int exit_value);
6469 #define IS_ALPHA(CHAR) \
6470 (((CHAR) >= 'a' && (CHAR) <= 'z') \
6471 || ((CHAR) >= 'A' && (CHAR) <= 'Z'))
6473 /* Non-zero if CHAR is a character than can occur in a mangled name. */
6474 #define is_mangled_char(CHAR) \
6475 (IS_ALPHA (CHAR) || IS_DIGIT (CHAR) \
6476 || (CHAR) == '_' || (CHAR) == '.' || (CHAR) == '$')
6478 /* The name of this program, as invoked. */
6479 const char* program_name;
6481 /* Prints usage summary to FP and then exits with EXIT_VALUE. */
6483 static void
6484 print_usage (FILE* fp, int exit_value)
6486 fprintf (fp, "Usage: %s [options] [names ...]\n", program_name);
6487 fprintf (fp, "Options:\n");
6488 fprintf (fp, " -h,--help Display this message.\n");
6489 fprintf (fp, " -p,--no-params Don't display function parameters\n");
6490 fprintf (fp, " -v,--verbose Produce verbose demanglings.\n");
6491 fprintf (fp, "If names are provided, they are demangled. Otherwise filters standard input.\n");
6493 exit (exit_value);
6496 /* Option specification for getopt_long. */
6497 static const struct option long_options[] =
6499 { "help", no_argument, NULL, 'h' },
6500 { "no-params", no_argument, NULL, 'p' },
6501 { "verbose", no_argument, NULL, 'v' },
6502 { NULL, no_argument, NULL, 0 },
6505 /* Main entry for a demangling filter executable. It will demangle
6506 its command line arguments, if any. If none are provided, it will
6507 filter stdin to stdout, replacing any recognized mangled C++ names
6508 with their demangled equivalents. */
6511 main (int argc, char *argv[])
6513 int i;
6514 int opt_char;
6515 int options = DMGL_PARAMS | DMGL_ANSI | DMGL_TYPES;
6517 /* Use the program name of this program, as invoked. */
6518 program_name = argv[0];
6520 /* Parse options. */
6523 opt_char = getopt_long (argc, argv, "hpv", long_options, NULL);
6524 switch (opt_char)
6526 case '?': /* Unrecognized option. */
6527 print_usage (stderr, 1);
6528 break;
6530 case 'h':
6531 print_usage (stdout, 0);
6532 break;
6534 case 'p':
6535 options &= ~ DMGL_PARAMS;
6536 break;
6538 case 'v':
6539 options |= DMGL_VERBOSE;
6540 break;
6543 while (opt_char != -1);
6545 if (optind == argc)
6546 /* No command line arguments were provided. Filter stdin. */
6548 dyn_string_t mangled = dyn_string_new (3);
6549 char *s;
6551 /* Read all of input. */
6552 while (!feof (stdin))
6554 char c;
6556 /* Pile characters into mangled until we hit one that can't
6557 occur in a mangled name. */
6558 c = getchar ();
6559 while (!feof (stdin) && is_mangled_char (c))
6561 dyn_string_append_char (mangled, c);
6562 if (feof (stdin))
6563 break;
6564 c = getchar ();
6567 if (dyn_string_length (mangled) > 0)
6569 #ifdef IN_GLIBCPP_V3
6570 s = __cxa_demangle (dyn_string_buf (mangled), NULL, NULL, NULL);
6571 #else
6572 s = cplus_demangle_v3 (dyn_string_buf (mangled), options);
6573 #endif
6575 if (s != NULL)
6577 fputs (s, stdout);
6578 free (s);
6580 else
6582 /* It might not have been a mangled name. Print the
6583 original text. */
6584 fputs (dyn_string_buf (mangled), stdout);
6587 dyn_string_clear (mangled);
6590 /* If we haven't hit EOF yet, we've read one character that
6591 can't occur in a mangled name, so print it out. */
6592 if (!feof (stdin))
6593 putchar (c);
6596 dyn_string_delete (mangled);
6598 else
6599 /* Demangle command line arguments. */
6601 /* Loop over command line arguments. */
6602 for (i = optind; i < argc; ++i)
6604 char *s;
6605 #ifdef IN_GLIBCPP_V3
6606 int status;
6607 #endif
6609 /* Attempt to demangle. */
6610 #ifdef IN_GLIBCPP_V3
6611 s = __cxa_demangle (argv[i], NULL, NULL, &status);
6612 #else
6613 s = cplus_demangle_v3 (argv[i], options);
6614 #endif
6616 /* If it worked, print the demangled name. */
6617 if (s != NULL)
6619 printf ("%s\n", s);
6620 free (s);
6622 else
6624 #ifdef IN_GLIBCPP_V3
6625 fprintf (stderr, "Failed: %s (status %d)\n", argv[i], status);
6626 #else
6627 fprintf (stderr, "Failed: %s\n", argv[i]);
6628 #endif
6633 return 0;
6636 #endif /* STANDALONE_DEMANGLER */