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
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
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
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
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:
74 If defined, this file defines the following functions, q.v.:
75 char *__cxa_demangle (const char *mangled, char *buf, size_t *len,
77 int __gcclibcxx_demangle_callback (const char *,
79 (const char *, size_t, void *),
81 instead of cplus_demangle_v3[_callback]() and
82 java_demangle_v3[_callback]().
85 If defined, this file defines only __cxa_demangle() and
86 __gcclibcxx_demangle_callback(), and no other publically visible
87 functions or variables.
90 If defined, this file defines a main() function which demangles
91 any arguments, or, if none, demangles stdin.
94 If defined, turns on debugging mode, which prints information on
95 stdout about the mangled string. This is not generally useful.
98 #if defined (_AIX) && !defined (__GNUC__)
120 # define alloca __builtin_alloca
122 extern char *alloca ();
123 # endif /* __GNUC__ */
125 #endif /* HAVE_ALLOCA_H */
127 #include "ansidecl.h"
128 #include "libiberty.h"
129 #include "demangle.h"
130 #include "cp-demangle.h"
132 /* If IN_GLIBCPP_V3 is defined, some functions are made static. We
133 also rename them via #define to avoid compiler errors when the
134 static definition conflicts with the extern declaration in a header
138 #define CP_STATIC_IF_GLIBCPP_V3 static
140 #define cplus_demangle_fill_name d_fill_name
141 static int d_fill_name (struct demangle_component
*, const char *, int);
143 #define cplus_demangle_fill_extended_operator d_fill_extended_operator
145 d_fill_extended_operator (struct demangle_component
*, int,
146 struct demangle_component
*);
148 #define cplus_demangle_fill_ctor d_fill_ctor
150 d_fill_ctor (struct demangle_component
*, enum gnu_v3_ctor_kinds
,
151 struct demangle_component
*);
153 #define cplus_demangle_fill_dtor d_fill_dtor
155 d_fill_dtor (struct demangle_component
*, enum gnu_v3_dtor_kinds
,
156 struct demangle_component
*);
158 #define cplus_demangle_mangled_name d_mangled_name
159 static struct demangle_component
*d_mangled_name (struct d_info
*, int);
161 #define cplus_demangle_type d_type
162 static struct demangle_component
*d_type (struct d_info
*);
164 #define cplus_demangle_print d_print
165 static char *d_print (int, const struct demangle_component
*, int, size_t *);
167 #define cplus_demangle_print_callback d_print_callback
168 static int d_print_callback (int, const struct demangle_component
*,
169 demangle_callbackref
, void *);
171 #define cplus_demangle_init_info d_init_info
172 static void d_init_info (const char *, int, size_t, struct d_info
*);
174 #else /* ! defined(IN_GLIBCPP_V3) */
175 #define CP_STATIC_IF_GLIBCPP_V3
176 #endif /* ! defined(IN_GLIBCPP_V3) */
178 /* See if the compiler supports dynamic arrays. */
181 #define CP_DYNAMIC_ARRAYS
184 #ifdef __STDC_VERSION__
185 #if __STDC_VERSION__ >= 199901L
186 #define CP_DYNAMIC_ARRAYS
187 #endif /* __STDC__VERSION >= 199901L */
188 #endif /* defined (__STDC_VERSION__) */
189 #endif /* defined (__STDC__) */
190 #endif /* ! defined (__GNUC__) */
192 /* We avoid pulling in the ctype tables, to prevent pulling in
193 additional unresolved symbols when this code is used in a library.
194 FIXME: Is this really a valid reason? This comes from the original
197 As of this writing this file has the following undefined references
198 when compiled with -DIN_GLIBCPP_V3: realloc, free, memcpy, strcpy,
201 #define IS_DIGIT(c) ((c) >= '0' && (c) <= '9')
202 #define IS_UPPER(c) ((c) >= 'A' && (c) <= 'Z')
203 #define IS_LOWER(c) ((c) >= 'a' && (c) <= 'z')
205 /* The prefix prepended by GCC to an identifier represnting the
206 anonymous namespace. */
207 #define ANONYMOUS_NAMESPACE_PREFIX "_GLOBAL_"
208 #define ANONYMOUS_NAMESPACE_PREFIX_LEN \
209 (sizeof (ANONYMOUS_NAMESPACE_PREFIX) - 1)
211 /* Information we keep for the standard substitutions. */
213 struct d_standard_sub_info
215 /* The code for this substitution. */
217 /* The simple string it expands to. */
218 const char *simple_expansion
;
219 /* The length of the simple expansion. */
221 /* The results of a full, verbose, expansion. This is used when
222 qualifying a constructor/destructor, or when in verbose mode. */
223 const char *full_expansion
;
224 /* The length of the full expansion. */
226 /* What to set the last_name field of d_info to; NULL if we should
227 not set it. This is only relevant when qualifying a
228 constructor/destructor. */
229 const char *set_last_name
;
230 /* The length of set_last_name. */
231 int set_last_name_len
;
234 /* Accessors for subtrees of struct demangle_component. */
236 #define d_left(dc) ((dc)->u.s_binary.left)
237 #define d_right(dc) ((dc)->u.s_binary.right)
239 /* A list of templates. This is used while printing. */
241 struct d_print_template
243 /* Next template on the list. */
244 struct d_print_template
*next
;
246 const struct demangle_component
*template_decl
;
249 /* A list of type modifiers. This is used while printing. */
253 /* Next modifier on the list. These are in the reverse of the order
254 in which they appeared in the mangled string. */
255 struct d_print_mod
*next
;
257 const struct demangle_component
*mod
;
258 /* Whether this modifier was printed. */
260 /* The list of templates which applies to this modifier. */
261 struct d_print_template
*templates
;
264 /* We use these structures to hold information during printing. */
266 struct d_growable_string
268 /* Buffer holding the result. */
270 /* Current length of data in buffer. */
272 /* Allocated size of buffer. */
274 /* Set to 1 if we had a memory allocation failure. */
275 int allocation_failure
;
278 /* Stack of components, innermost first, used to avoid loops. */
280 struct d_component_stack
282 /* This component. */
283 const struct demangle_component
*dc
;
284 /* This component's parent. */
285 const struct d_component_stack
*parent
;
288 /* A demangle component and some scope captured when it was first
293 /* The component whose scope this is. */
294 const struct demangle_component
*container
;
295 /* The list of templates, if any, that was current when this
296 scope was captured. */
297 struct d_print_template
*templates
;
300 /* Checkpoint structure to allow backtracking. This holds copies
301 of the fields of struct d_info that need to be restored
302 if a trial parse needs to be backtracked over. */
304 struct d_info_checkpoint
313 enum { D_PRINT_BUFFER_LENGTH
= 256 };
316 /* Fixed-length allocated buffer for demangled data, flushed to the
317 callback with a NUL termination once full. */
318 char buf
[D_PRINT_BUFFER_LENGTH
];
319 /* Current length of data in buffer. */
321 /* The last character printed, saved individually so that it survives
324 /* Callback function to handle demangled buffer flush. */
325 demangle_callbackref callback
;
326 /* Opaque callback argument. */
328 /* The current list of templates, if any. */
329 struct d_print_template
*templates
;
330 /* The current list of modifiers (e.g., pointer, reference, etc.),
332 struct d_print_mod
*modifiers
;
333 /* Set to 1 if we saw a demangling error. */
334 int demangle_failure
;
335 /* The current index into any template argument packs we are using
338 /* Number of d_print_flush calls so far. */
339 unsigned long int flush_count
;
340 /* Stack of components, innermost first, used to avoid loops. */
341 const struct d_component_stack
*component_stack
;
342 /* Array of saved scopes for evaluating substitutions. */
343 struct d_saved_scope
*saved_scopes
;
344 /* Index of the next unused saved scope in the above array. */
345 int next_saved_scope
;
346 /* Number of saved scopes in the above array. */
347 int num_saved_scopes
;
348 /* Array of templates for saving into scopes. */
349 struct d_print_template
*copy_templates
;
350 /* Index of the next unused copy template in the above array. */
351 int next_copy_template
;
352 /* Number of copy templates in the above array. */
353 int num_copy_templates
;
354 /* The nearest enclosing template, if any. */
355 const struct demangle_component
*current_template
;
358 #ifdef CP_DEMANGLE_DEBUG
359 static void d_dump (struct demangle_component
*, int);
362 static struct demangle_component
*
363 d_make_empty (struct d_info
*);
365 static struct demangle_component
*
366 d_make_comp (struct d_info
*, enum demangle_component_type
,
367 struct demangle_component
*,
368 struct demangle_component
*);
370 static struct demangle_component
*
371 d_make_name (struct d_info
*, const char *, int);
373 static struct demangle_component
*
374 d_make_demangle_mangled_name (struct d_info
*, const char *);
376 static struct demangle_component
*
377 d_make_builtin_type (struct d_info
*,
378 const struct demangle_builtin_type_info
*);
380 static struct demangle_component
*
381 d_make_operator (struct d_info
*,
382 const struct demangle_operator_info
*);
384 static struct demangle_component
*
385 d_make_extended_operator (struct d_info
*, int,
386 struct demangle_component
*);
388 static struct demangle_component
*
389 d_make_ctor (struct d_info
*, enum gnu_v3_ctor_kinds
,
390 struct demangle_component
*);
392 static struct demangle_component
*
393 d_make_dtor (struct d_info
*, enum gnu_v3_dtor_kinds
,
394 struct demangle_component
*);
396 static struct demangle_component
*
397 d_make_template_param (struct d_info
*, long);
399 static struct demangle_component
*
400 d_make_sub (struct d_info
*, const char *, int);
403 has_return_type (struct demangle_component
*);
406 is_ctor_dtor_or_conversion (struct demangle_component
*);
408 static struct demangle_component
*d_encoding (struct d_info
*, int);
410 static struct demangle_component
*d_name (struct d_info
*);
412 static struct demangle_component
*d_nested_name (struct d_info
*);
414 static struct demangle_component
*d_prefix (struct d_info
*);
416 static struct demangle_component
*d_unqualified_name (struct d_info
*);
418 static struct demangle_component
*d_source_name (struct d_info
*);
420 static long d_number (struct d_info
*);
422 static struct demangle_component
*d_identifier (struct d_info
*, int);
424 static struct demangle_component
*d_operator_name (struct d_info
*);
426 static struct demangle_component
*d_special_name (struct d_info
*);
428 static int d_call_offset (struct d_info
*, int);
430 static struct demangle_component
*d_ctor_dtor_name (struct d_info
*);
432 static struct demangle_component
**
433 d_cv_qualifiers (struct d_info
*, struct demangle_component
**, int);
435 static struct demangle_component
*
436 d_ref_qualifier (struct d_info
*, struct demangle_component
*);
438 static struct demangle_component
*
439 d_function_type (struct d_info
*);
441 static struct demangle_component
*
442 d_bare_function_type (struct d_info
*, int);
444 static struct demangle_component
*
445 d_class_enum_type (struct d_info
*);
447 static struct demangle_component
*d_array_type (struct d_info
*);
449 static struct demangle_component
*d_vector_type (struct d_info
*);
451 static struct demangle_component
*
452 d_pointer_to_member_type (struct d_info
*);
454 static struct demangle_component
*
455 d_template_param (struct d_info
*);
457 static struct demangle_component
*d_template_args (struct d_info
*);
459 static struct demangle_component
*
460 d_template_arg (struct d_info
*);
462 static struct demangle_component
*d_expression (struct d_info
*);
464 static struct demangle_component
*d_expr_primary (struct d_info
*);
466 static struct demangle_component
*d_local_name (struct d_info
*);
468 static int d_discriminator (struct d_info
*);
470 static struct demangle_component
*d_lambda (struct d_info
*);
472 static struct demangle_component
*d_unnamed_type (struct d_info
*);
474 static struct demangle_component
*
475 d_clone_suffix (struct d_info
*, struct demangle_component
*);
478 d_add_substitution (struct d_info
*, struct demangle_component
*);
480 static struct demangle_component
*d_substitution (struct d_info
*, int);
482 static void d_checkpoint (struct d_info
*, struct d_info_checkpoint
*);
484 static void d_backtrack (struct d_info
*, struct d_info_checkpoint
*);
486 static void d_growable_string_init (struct d_growable_string
*, size_t);
489 d_growable_string_resize (struct d_growable_string
*, size_t);
492 d_growable_string_append_buffer (struct d_growable_string
*,
493 const char *, size_t);
495 d_growable_string_callback_adapter (const char *, size_t, void *);
498 d_print_init (struct d_print_info
*, demangle_callbackref
, void *,
499 const struct demangle_component
*);
501 static inline void d_print_error (struct d_print_info
*);
503 static inline int d_print_saw_error (struct d_print_info
*);
505 static inline void d_print_flush (struct d_print_info
*);
507 static inline void d_append_char (struct d_print_info
*, char);
509 static inline void d_append_buffer (struct d_print_info
*,
510 const char *, size_t);
512 static inline void d_append_string (struct d_print_info
*, const char *);
514 static inline char d_last_char (struct d_print_info
*);
517 d_print_comp (struct d_print_info
*, int, const struct demangle_component
*);
520 d_print_java_identifier (struct d_print_info
*, const char *, int);
523 d_print_mod_list (struct d_print_info
*, int, struct d_print_mod
*, int);
526 d_print_mod (struct d_print_info
*, int, const struct demangle_component
*);
529 d_print_function_type (struct d_print_info
*, int,
530 const struct demangle_component
*,
531 struct d_print_mod
*);
534 d_print_array_type (struct d_print_info
*, int,
535 const struct demangle_component
*,
536 struct d_print_mod
*);
539 d_print_expr_op (struct d_print_info
*, int, const struct demangle_component
*);
542 d_print_cast (struct d_print_info
*, int, const struct demangle_component
*);
544 static int d_demangle_callback (const char *, int,
545 demangle_callbackref
, void *);
546 static char *d_demangle (const char *, int, size_t *);
548 #ifdef CP_DEMANGLE_DEBUG
551 d_dump (struct demangle_component
*dc
, int indent
)
558 printf ("failed demangling\n");
562 for (i
= 0; i
< indent
; ++i
)
567 case DEMANGLE_COMPONENT_NAME
:
568 printf ("name '%.*s'\n", dc
->u
.s_name
.len
, dc
->u
.s_name
.s
);
570 case DEMANGLE_COMPONENT_TAGGED_NAME
:
571 printf ("tagged name\n");
572 d_dump (dc
->u
.s_binary
.left
, indent
+ 2);
573 d_dump (dc
->u
.s_binary
.right
, indent
+ 2);
575 case DEMANGLE_COMPONENT_TEMPLATE_PARAM
:
576 printf ("template parameter %ld\n", dc
->u
.s_number
.number
);
578 case DEMANGLE_COMPONENT_FUNCTION_PARAM
:
579 printf ("function parameter %ld\n", dc
->u
.s_number
.number
);
581 case DEMANGLE_COMPONENT_CTOR
:
582 printf ("constructor %d\n", (int) dc
->u
.s_ctor
.kind
);
583 d_dump (dc
->u
.s_ctor
.name
, indent
+ 2);
585 case DEMANGLE_COMPONENT_DTOR
:
586 printf ("destructor %d\n", (int) dc
->u
.s_dtor
.kind
);
587 d_dump (dc
->u
.s_dtor
.name
, indent
+ 2);
589 case DEMANGLE_COMPONENT_SUB_STD
:
590 printf ("standard substitution %s\n", dc
->u
.s_string
.string
);
592 case DEMANGLE_COMPONENT_BUILTIN_TYPE
:
593 printf ("builtin type %s\n", dc
->u
.s_builtin
.type
->name
);
595 case DEMANGLE_COMPONENT_OPERATOR
:
596 printf ("operator %s\n", dc
->u
.s_operator
.op
->name
);
598 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
599 printf ("extended operator with %d args\n",
600 dc
->u
.s_extended_operator
.args
);
601 d_dump (dc
->u
.s_extended_operator
.name
, indent
+ 2);
604 case DEMANGLE_COMPONENT_QUAL_NAME
:
605 printf ("qualified name\n");
607 case DEMANGLE_COMPONENT_LOCAL_NAME
:
608 printf ("local name\n");
610 case DEMANGLE_COMPONENT_TYPED_NAME
:
611 printf ("typed name\n");
613 case DEMANGLE_COMPONENT_TEMPLATE
:
614 printf ("template\n");
616 case DEMANGLE_COMPONENT_VTABLE
:
619 case DEMANGLE_COMPONENT_VTT
:
622 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
:
623 printf ("construction vtable\n");
625 case DEMANGLE_COMPONENT_TYPEINFO
:
626 printf ("typeinfo\n");
628 case DEMANGLE_COMPONENT_TYPEINFO_NAME
:
629 printf ("typeinfo name\n");
631 case DEMANGLE_COMPONENT_TYPEINFO_FN
:
632 printf ("typeinfo function\n");
634 case DEMANGLE_COMPONENT_THUNK
:
637 case DEMANGLE_COMPONENT_VIRTUAL_THUNK
:
638 printf ("virtual thunk\n");
640 case DEMANGLE_COMPONENT_COVARIANT_THUNK
:
641 printf ("covariant thunk\n");
643 case DEMANGLE_COMPONENT_JAVA_CLASS
:
644 printf ("java class\n");
646 case DEMANGLE_COMPONENT_GUARD
:
649 case DEMANGLE_COMPONENT_REFTEMP
:
650 printf ("reference temporary\n");
652 case DEMANGLE_COMPONENT_HIDDEN_ALIAS
:
653 printf ("hidden alias\n");
655 case DEMANGLE_COMPONENT_TRANSACTION_CLONE
:
656 printf ("transaction clone\n");
658 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
:
659 printf ("non-transaction clone\n");
661 case DEMANGLE_COMPONENT_RESTRICT
:
662 printf ("restrict\n");
664 case DEMANGLE_COMPONENT_VOLATILE
:
665 printf ("volatile\n");
667 case DEMANGLE_COMPONENT_CONST
:
670 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
671 printf ("restrict this\n");
673 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
674 printf ("volatile this\n");
676 case DEMANGLE_COMPONENT_CONST_THIS
:
677 printf ("const this\n");
679 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
680 printf ("reference this\n");
682 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
683 printf ("rvalue reference this\n");
685 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
686 printf ("vendor type qualifier\n");
688 case DEMANGLE_COMPONENT_POINTER
:
689 printf ("pointer\n");
691 case DEMANGLE_COMPONENT_REFERENCE
:
692 printf ("reference\n");
694 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
695 printf ("rvalue reference\n");
697 case DEMANGLE_COMPONENT_COMPLEX
:
698 printf ("complex\n");
700 case DEMANGLE_COMPONENT_IMAGINARY
:
701 printf ("imaginary\n");
703 case DEMANGLE_COMPONENT_VENDOR_TYPE
:
704 printf ("vendor type\n");
706 case DEMANGLE_COMPONENT_FUNCTION_TYPE
:
707 printf ("function type\n");
709 case DEMANGLE_COMPONENT_ARRAY_TYPE
:
710 printf ("array type\n");
712 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
713 printf ("pointer to member type\n");
715 case DEMANGLE_COMPONENT_FIXED_TYPE
:
716 printf ("fixed-point type, accum? %d, sat? %d\n",
717 dc
->u
.s_fixed
.accum
, dc
->u
.s_fixed
.sat
);
718 d_dump (dc
->u
.s_fixed
.length
, indent
+ 2)
720 case DEMANGLE_COMPONENT_ARGLIST
:
721 printf ("argument list\n");
723 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
:
724 printf ("template argument list\n");
726 case DEMANGLE_COMPONENT_INITIALIZER_LIST
:
727 printf ("initializer list\n");
729 case DEMANGLE_COMPONENT_CAST
:
732 case DEMANGLE_COMPONENT_NULLARY
:
733 printf ("nullary operator\n");
735 case DEMANGLE_COMPONENT_UNARY
:
736 printf ("unary operator\n");
738 case DEMANGLE_COMPONENT_BINARY
:
739 printf ("binary operator\n");
741 case DEMANGLE_COMPONENT_BINARY_ARGS
:
742 printf ("binary operator arguments\n");
744 case DEMANGLE_COMPONENT_TRINARY
:
745 printf ("trinary operator\n");
747 case DEMANGLE_COMPONENT_TRINARY_ARG1
:
748 printf ("trinary operator arguments 1\n");
750 case DEMANGLE_COMPONENT_TRINARY_ARG2
:
751 printf ("trinary operator arguments 1\n");
753 case DEMANGLE_COMPONENT_LITERAL
:
754 printf ("literal\n");
756 case DEMANGLE_COMPONENT_LITERAL_NEG
:
757 printf ("negative literal\n");
759 case DEMANGLE_COMPONENT_JAVA_RESOURCE
:
760 printf ("java resource\n");
762 case DEMANGLE_COMPONENT_COMPOUND_NAME
:
763 printf ("compound name\n");
765 case DEMANGLE_COMPONENT_CHARACTER
:
766 printf ("character '%c'\n", dc
->u
.s_character
.character
);
768 case DEMANGLE_COMPONENT_NUMBER
:
769 printf ("number %ld\n", dc
->u
.s_number
.number
);
771 case DEMANGLE_COMPONENT_DECLTYPE
:
772 printf ("decltype\n");
774 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
775 printf ("pack expansion\n");
777 case DEMANGLE_COMPONENT_TLS_INIT
:
778 printf ("tls init function\n");
780 case DEMANGLE_COMPONENT_TLS_WRAPPER
:
781 printf ("tls wrapper function\n");
783 case DEMANGLE_COMPONENT_DEFAULT_ARG
:
784 printf ("default argument %d\n", dc
->u
.s_unary_num
.num
);
785 d_dump (dc
->u
.s_unary_num
.sub
, indent
+2);
787 case DEMANGLE_COMPONENT_LAMBDA
:
788 printf ("lambda %d\n", dc
->u
.s_unary_num
.num
);
789 d_dump (dc
->u
.s_unary_num
.sub
, indent
+2);
793 d_dump (d_left (dc
), indent
+ 2);
794 d_dump (d_right (dc
), indent
+ 2);
797 #endif /* CP_DEMANGLE_DEBUG */
799 /* Fill in a DEMANGLE_COMPONENT_NAME. */
801 CP_STATIC_IF_GLIBCPP_V3
803 cplus_demangle_fill_name (struct demangle_component
*p
, const char *s
, int len
)
805 if (p
== NULL
|| s
== NULL
|| len
== 0)
807 p
->type
= DEMANGLE_COMPONENT_NAME
;
809 p
->u
.s_name
.len
= len
;
813 /* Fill in a DEMANGLE_COMPONENT_EXTENDED_OPERATOR. */
815 CP_STATIC_IF_GLIBCPP_V3
817 cplus_demangle_fill_extended_operator (struct demangle_component
*p
, int args
,
818 struct demangle_component
*name
)
820 if (p
== NULL
|| args
< 0 || name
== NULL
)
822 p
->type
= DEMANGLE_COMPONENT_EXTENDED_OPERATOR
;
823 p
->u
.s_extended_operator
.args
= args
;
824 p
->u
.s_extended_operator
.name
= name
;
828 /* Fill in a DEMANGLE_COMPONENT_CTOR. */
830 CP_STATIC_IF_GLIBCPP_V3
832 cplus_demangle_fill_ctor (struct demangle_component
*p
,
833 enum gnu_v3_ctor_kinds kind
,
834 struct demangle_component
*name
)
838 || (int) kind
< gnu_v3_complete_object_ctor
839 || (int) kind
> gnu_v3_object_ctor_group
)
841 p
->type
= DEMANGLE_COMPONENT_CTOR
;
842 p
->u
.s_ctor
.kind
= kind
;
843 p
->u
.s_ctor
.name
= name
;
847 /* Fill in a DEMANGLE_COMPONENT_DTOR. */
849 CP_STATIC_IF_GLIBCPP_V3
851 cplus_demangle_fill_dtor (struct demangle_component
*p
,
852 enum gnu_v3_dtor_kinds kind
,
853 struct demangle_component
*name
)
857 || (int) kind
< gnu_v3_deleting_dtor
858 || (int) kind
> gnu_v3_object_dtor_group
)
860 p
->type
= DEMANGLE_COMPONENT_DTOR
;
861 p
->u
.s_dtor
.kind
= kind
;
862 p
->u
.s_dtor
.name
= name
;
866 /* Add a new component. */
868 static struct demangle_component
*
869 d_make_empty (struct d_info
*di
)
871 struct demangle_component
*p
;
873 if (di
->next_comp
>= di
->num_comps
)
875 p
= &di
->comps
[di
->next_comp
];
880 /* Add a new generic component. */
882 static struct demangle_component
*
883 d_make_comp (struct d_info
*di
, enum demangle_component_type type
,
884 struct demangle_component
*left
,
885 struct demangle_component
*right
)
887 struct demangle_component
*p
;
889 /* We check for errors here. A typical error would be a NULL return
890 from a subroutine. We catch those here, and return NULL
894 /* These types require two parameters. */
895 case DEMANGLE_COMPONENT_QUAL_NAME
:
896 case DEMANGLE_COMPONENT_LOCAL_NAME
:
897 case DEMANGLE_COMPONENT_TYPED_NAME
:
898 case DEMANGLE_COMPONENT_TAGGED_NAME
:
899 case DEMANGLE_COMPONENT_TEMPLATE
:
900 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
:
901 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
902 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
903 case DEMANGLE_COMPONENT_UNARY
:
904 case DEMANGLE_COMPONENT_BINARY
:
905 case DEMANGLE_COMPONENT_BINARY_ARGS
:
906 case DEMANGLE_COMPONENT_TRINARY
:
907 case DEMANGLE_COMPONENT_TRINARY_ARG1
:
908 case DEMANGLE_COMPONENT_LITERAL
:
909 case DEMANGLE_COMPONENT_LITERAL_NEG
:
910 case DEMANGLE_COMPONENT_COMPOUND_NAME
:
911 case DEMANGLE_COMPONENT_VECTOR_TYPE
:
912 case DEMANGLE_COMPONENT_CLONE
:
913 if (left
== NULL
|| right
== NULL
)
917 /* These types only require one parameter. */
918 case DEMANGLE_COMPONENT_VTABLE
:
919 case DEMANGLE_COMPONENT_VTT
:
920 case DEMANGLE_COMPONENT_TYPEINFO
:
921 case DEMANGLE_COMPONENT_TYPEINFO_NAME
:
922 case DEMANGLE_COMPONENT_TYPEINFO_FN
:
923 case DEMANGLE_COMPONENT_THUNK
:
924 case DEMANGLE_COMPONENT_VIRTUAL_THUNK
:
925 case DEMANGLE_COMPONENT_COVARIANT_THUNK
:
926 case DEMANGLE_COMPONENT_JAVA_CLASS
:
927 case DEMANGLE_COMPONENT_GUARD
:
928 case DEMANGLE_COMPONENT_TLS_INIT
:
929 case DEMANGLE_COMPONENT_TLS_WRAPPER
:
930 case DEMANGLE_COMPONENT_REFTEMP
:
931 case DEMANGLE_COMPONENT_HIDDEN_ALIAS
:
932 case DEMANGLE_COMPONENT_TRANSACTION_CLONE
:
933 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
:
934 case DEMANGLE_COMPONENT_POINTER
:
935 case DEMANGLE_COMPONENT_REFERENCE
:
936 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
937 case DEMANGLE_COMPONENT_COMPLEX
:
938 case DEMANGLE_COMPONENT_IMAGINARY
:
939 case DEMANGLE_COMPONENT_VENDOR_TYPE
:
940 case DEMANGLE_COMPONENT_CAST
:
941 case DEMANGLE_COMPONENT_JAVA_RESOURCE
:
942 case DEMANGLE_COMPONENT_DECLTYPE
:
943 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
944 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
:
945 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS
:
946 case DEMANGLE_COMPONENT_NULLARY
:
947 case DEMANGLE_COMPONENT_TRINARY_ARG2
:
952 /* This needs a right parameter, but the left parameter can be
954 case DEMANGLE_COMPONENT_ARRAY_TYPE
:
955 case DEMANGLE_COMPONENT_INITIALIZER_LIST
:
960 /* These are allowed to have no parameters--in some cases they
961 will be filled in later. */
962 case DEMANGLE_COMPONENT_FUNCTION_TYPE
:
963 case DEMANGLE_COMPONENT_RESTRICT
:
964 case DEMANGLE_COMPONENT_VOLATILE
:
965 case DEMANGLE_COMPONENT_CONST
:
966 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
967 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
968 case DEMANGLE_COMPONENT_CONST_THIS
:
969 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
970 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
971 case DEMANGLE_COMPONENT_ARGLIST
:
972 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
:
975 /* Other types should not be seen here. */
980 p
= d_make_empty (di
);
984 p
->u
.s_binary
.left
= left
;
985 p
->u
.s_binary
.right
= right
;
990 /* Add a new demangle mangled name component. */
992 static struct demangle_component
*
993 d_make_demangle_mangled_name (struct d_info
*di
, const char *s
)
995 if (d_peek_char (di
) != '_' || d_peek_next_char (di
) != 'Z')
996 return d_make_name (di
, s
, strlen (s
));
998 return d_encoding (di
, 0);
1001 /* Add a new name component. */
1003 static struct demangle_component
*
1004 d_make_name (struct d_info
*di
, const char *s
, int len
)
1006 struct demangle_component
*p
;
1008 p
= d_make_empty (di
);
1009 if (! cplus_demangle_fill_name (p
, s
, len
))
1014 /* Add a new builtin type component. */
1016 static struct demangle_component
*
1017 d_make_builtin_type (struct d_info
*di
,
1018 const struct demangle_builtin_type_info
*type
)
1020 struct demangle_component
*p
;
1024 p
= d_make_empty (di
);
1027 p
->type
= DEMANGLE_COMPONENT_BUILTIN_TYPE
;
1028 p
->u
.s_builtin
.type
= type
;
1033 /* Add a new operator component. */
1035 static struct demangle_component
*
1036 d_make_operator (struct d_info
*di
, const struct demangle_operator_info
*op
)
1038 struct demangle_component
*p
;
1040 p
= d_make_empty (di
);
1043 p
->type
= DEMANGLE_COMPONENT_OPERATOR
;
1044 p
->u
.s_operator
.op
= op
;
1049 /* Add a new extended operator component. */
1051 static struct demangle_component
*
1052 d_make_extended_operator (struct d_info
*di
, int args
,
1053 struct demangle_component
*name
)
1055 struct demangle_component
*p
;
1057 p
= d_make_empty (di
);
1058 if (! cplus_demangle_fill_extended_operator (p
, args
, name
))
1063 static struct demangle_component
*
1064 d_make_default_arg (struct d_info
*di
, int num
,
1065 struct demangle_component
*sub
)
1067 struct demangle_component
*p
= d_make_empty (di
);
1070 p
->type
= DEMANGLE_COMPONENT_DEFAULT_ARG
;
1071 p
->u
.s_unary_num
.num
= num
;
1072 p
->u
.s_unary_num
.sub
= sub
;
1077 /* Add a new constructor component. */
1079 static struct demangle_component
*
1080 d_make_ctor (struct d_info
*di
, enum gnu_v3_ctor_kinds kind
,
1081 struct demangle_component
*name
)
1083 struct demangle_component
*p
;
1085 p
= d_make_empty (di
);
1086 if (! cplus_demangle_fill_ctor (p
, kind
, name
))
1091 /* Add a new destructor component. */
1093 static struct demangle_component
*
1094 d_make_dtor (struct d_info
*di
, enum gnu_v3_dtor_kinds kind
,
1095 struct demangle_component
*name
)
1097 struct demangle_component
*p
;
1099 p
= d_make_empty (di
);
1100 if (! cplus_demangle_fill_dtor (p
, kind
, name
))
1105 /* Add a new template parameter. */
1107 static struct demangle_component
*
1108 d_make_template_param (struct d_info
*di
, long i
)
1110 struct demangle_component
*p
;
1112 p
= d_make_empty (di
);
1115 p
->type
= DEMANGLE_COMPONENT_TEMPLATE_PARAM
;
1116 p
->u
.s_number
.number
= i
;
1121 /* Add a new function parameter. */
1123 static struct demangle_component
*
1124 d_make_function_param (struct d_info
*di
, long i
)
1126 struct demangle_component
*p
;
1128 p
= d_make_empty (di
);
1131 p
->type
= DEMANGLE_COMPONENT_FUNCTION_PARAM
;
1132 p
->u
.s_number
.number
= i
;
1137 /* Add a new standard substitution component. */
1139 static struct demangle_component
*
1140 d_make_sub (struct d_info
*di
, const char *name
, int len
)
1142 struct demangle_component
*p
;
1144 p
= d_make_empty (di
);
1147 p
->type
= DEMANGLE_COMPONENT_SUB_STD
;
1148 p
->u
.s_string
.string
= name
;
1149 p
->u
.s_string
.len
= len
;
1154 /* <mangled-name> ::= _Z <encoding> [<clone-suffix>]*
1156 TOP_LEVEL is non-zero when called at the top level. */
1158 CP_STATIC_IF_GLIBCPP_V3
1159 struct demangle_component
*
1160 cplus_demangle_mangled_name (struct d_info
*di
, int top_level
)
1162 struct demangle_component
*p
;
1164 if (! d_check_char (di
, '_')
1165 /* Allow missing _ if not at toplevel to work around a
1166 bug in G++ abi-version=2 mangling; see the comment in
1167 write_template_arg. */
1170 if (! d_check_char (di
, 'Z'))
1172 p
= d_encoding (di
, top_level
);
1174 /* If at top level and parsing parameters, check for a clone
1176 if (top_level
&& (di
->options
& DMGL_PARAMS
) != 0)
1177 while (d_peek_char (di
) == '.'
1178 && (IS_LOWER (d_peek_next_char (di
))
1179 || d_peek_next_char (di
) == '_'
1180 || IS_DIGIT (d_peek_next_char (di
))))
1181 p
= d_clone_suffix (di
, p
);
1186 /* Return whether a function should have a return type. The argument
1187 is the function name, which may be qualified in various ways. The
1188 rules are that template functions have return types with some
1189 exceptions, function types which are not part of a function name
1190 mangling have return types with some exceptions, and non-template
1191 function names do not have return types. The exceptions are that
1192 constructors, destructors, and conversion operators do not have
1196 has_return_type (struct demangle_component
*dc
)
1204 case DEMANGLE_COMPONENT_TEMPLATE
:
1205 return ! is_ctor_dtor_or_conversion (d_left (dc
));
1206 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
1207 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
1208 case DEMANGLE_COMPONENT_CONST_THIS
:
1209 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
1210 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
1211 return has_return_type (d_left (dc
));
1215 /* Return whether a name is a constructor, a destructor, or a
1216 conversion operator. */
1219 is_ctor_dtor_or_conversion (struct demangle_component
*dc
)
1227 case DEMANGLE_COMPONENT_QUAL_NAME
:
1228 case DEMANGLE_COMPONENT_LOCAL_NAME
:
1229 return is_ctor_dtor_or_conversion (d_right (dc
));
1230 case DEMANGLE_COMPONENT_CTOR
:
1231 case DEMANGLE_COMPONENT_DTOR
:
1232 case DEMANGLE_COMPONENT_CAST
:
1237 /* <encoding> ::= <(function) name> <bare-function-type>
1241 TOP_LEVEL is non-zero when called at the top level, in which case
1242 if DMGL_PARAMS is not set we do not demangle the function
1243 parameters. We only set this at the top level, because otherwise
1244 we would not correctly demangle names in local scopes. */
1246 static struct demangle_component
*
1247 d_encoding (struct d_info
*di
, int top_level
)
1249 char peek
= d_peek_char (di
);
1251 if (peek
== 'G' || peek
== 'T')
1252 return d_special_name (di
);
1255 struct demangle_component
*dc
;
1259 if (dc
!= NULL
&& top_level
&& (di
->options
& DMGL_PARAMS
) == 0)
1261 /* Strip off any initial CV-qualifiers, as they really apply
1262 to the `this' parameter, and they were not output by the
1263 v2 demangler without DMGL_PARAMS. */
1264 while (dc
->type
== DEMANGLE_COMPONENT_RESTRICT_THIS
1265 || dc
->type
== DEMANGLE_COMPONENT_VOLATILE_THIS
1266 || dc
->type
== DEMANGLE_COMPONENT_CONST_THIS
1267 || dc
->type
== DEMANGLE_COMPONENT_REFERENCE_THIS
1268 || dc
->type
== DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
)
1271 /* If the top level is a DEMANGLE_COMPONENT_LOCAL_NAME, then
1272 there may be CV-qualifiers on its right argument which
1273 really apply here; this happens when parsing a class
1274 which is local to a function. */
1275 if (dc
->type
== DEMANGLE_COMPONENT_LOCAL_NAME
)
1277 struct demangle_component
*dcr
;
1280 while (dcr
->type
== DEMANGLE_COMPONENT_RESTRICT_THIS
1281 || dcr
->type
== DEMANGLE_COMPONENT_VOLATILE_THIS
1282 || dcr
->type
== DEMANGLE_COMPONENT_CONST_THIS
1283 || dcr
->type
== DEMANGLE_COMPONENT_REFERENCE_THIS
1284 || dcr
->type
== DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
)
1286 dc
->u
.s_binary
.right
= dcr
;
1292 peek
= d_peek_char (di
);
1293 if (dc
== NULL
|| peek
== '\0' || peek
== 'E')
1295 return d_make_comp (di
, DEMANGLE_COMPONENT_TYPED_NAME
, dc
,
1296 d_bare_function_type (di
, has_return_type (dc
)));
1300 /* <tagged-name> ::= <name> B <source-name> */
1302 static struct demangle_component
*
1303 d_abi_tags (struct d_info
*di
, struct demangle_component
*dc
)
1305 struct demangle_component
*hold_last_name
;
1308 /* Preserve the last name, so the ABI tag doesn't clobber it. */
1309 hold_last_name
= di
->last_name
;
1311 while (peek
= d_peek_char (di
),
1314 struct demangle_component
*tag
;
1316 tag
= d_source_name (di
);
1317 dc
= d_make_comp (di
, DEMANGLE_COMPONENT_TAGGED_NAME
, dc
, tag
);
1320 di
->last_name
= hold_last_name
;
1325 /* <name> ::= <nested-name>
1327 ::= <unscoped-template-name> <template-args>
1330 <unscoped-name> ::= <unqualified-name>
1331 ::= St <unqualified-name>
1333 <unscoped-template-name> ::= <unscoped-name>
1337 static struct demangle_component
*
1338 d_name (struct d_info
*di
)
1340 char peek
= d_peek_char (di
);
1341 struct demangle_component
*dc
;
1346 return d_nested_name (di
);
1349 return d_local_name (di
);
1352 return d_unqualified_name (di
);
1358 if (d_peek_next_char (di
) != 't')
1360 dc
= d_substitution (di
, 0);
1366 dc
= d_make_comp (di
, DEMANGLE_COMPONENT_QUAL_NAME
,
1367 d_make_name (di
, "std", 3),
1368 d_unqualified_name (di
));
1373 if (d_peek_char (di
) != 'I')
1375 /* The grammar does not permit this case to occur if we
1376 called d_substitution() above (i.e., subst == 1). We
1377 don't bother to check. */
1381 /* This is <template-args>, which means that we just saw
1382 <unscoped-template-name>, which is a substitution
1383 candidate if we didn't just get it from a
1387 if (! d_add_substitution (di
, dc
))
1390 dc
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, dc
,
1391 d_template_args (di
));
1399 dc
= d_unqualified_name (di
);
1400 if (d_peek_char (di
) == 'I')
1402 /* This is <template-args>, which means that we just saw
1403 <unscoped-template-name>, which is a substitution
1405 if (! d_add_substitution (di
, dc
))
1407 dc
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, dc
,
1408 d_template_args (di
));
1414 /* <nested-name> ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E
1415 ::= N [<CV-qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E
1418 static struct demangle_component
*
1419 d_nested_name (struct d_info
*di
)
1421 struct demangle_component
*ret
;
1422 struct demangle_component
**pret
;
1423 struct demangle_component
*rqual
;
1425 if (! d_check_char (di
, 'N'))
1428 pret
= d_cv_qualifiers (di
, &ret
, 1);
1432 /* Parse the ref-qualifier now and then attach it
1433 once we have something to attach it to. */
1434 rqual
= d_ref_qualifier (di
, NULL
);
1436 *pret
= d_prefix (di
);
1442 d_left (rqual
) = ret
;
1446 if (! d_check_char (di
, 'E'))
1452 /* <prefix> ::= <prefix> <unqualified-name>
1453 ::= <template-prefix> <template-args>
1454 ::= <template-param>
1459 <template-prefix> ::= <prefix> <(template) unqualified-name>
1460 ::= <template-param>
1464 static struct demangle_component
*
1465 d_prefix (struct d_info
*di
)
1467 struct demangle_component
*ret
= NULL
;
1472 enum demangle_component_type comb_type
;
1473 struct demangle_component
*dc
;
1475 peek
= d_peek_char (di
);
1479 /* The older code accepts a <local-name> here, but I don't see
1480 that in the grammar. The older code does not accept a
1481 <template-param> here. */
1483 comb_type
= DEMANGLE_COMPONENT_QUAL_NAME
;
1486 char peek2
= d_peek_next_char (di
);
1487 if (peek2
== 'T' || peek2
== 't')
1489 dc
= cplus_demangle_type (di
);
1491 /* Destructor name. */
1492 dc
= d_unqualified_name (di
);
1494 else if (IS_DIGIT (peek
)
1499 dc
= d_unqualified_name (di
);
1500 else if (peek
== 'S')
1501 dc
= d_substitution (di
, 1);
1502 else if (peek
== 'I')
1506 comb_type
= DEMANGLE_COMPONENT_TEMPLATE
;
1507 dc
= d_template_args (di
);
1509 else if (peek
== 'T')
1510 dc
= d_template_param (di
);
1511 else if (peek
== 'E')
1513 else if (peek
== 'M')
1515 /* Initializer scope for a lambda. We don't need to represent
1516 this; the normal code will just treat the variable as a type
1517 scope, which gives appropriate output. */
1529 ret
= d_make_comp (di
, comb_type
, ret
, dc
);
1531 if (peek
!= 'S' && d_peek_char (di
) != 'E')
1533 if (! d_add_substitution (di
, ret
))
1539 /* <unqualified-name> ::= <operator-name>
1540 ::= <ctor-dtor-name>
1542 ::= <local-source-name>
1544 <local-source-name> ::= L <source-name> <discriminator>
1547 static struct demangle_component
*
1548 d_unqualified_name (struct d_info
*di
)
1550 struct demangle_component
*ret
;
1553 peek
= d_peek_char (di
);
1554 if (IS_DIGIT (peek
))
1555 ret
= d_source_name (di
);
1556 else if (IS_LOWER (peek
))
1558 ret
= d_operator_name (di
);
1559 if (ret
!= NULL
&& ret
->type
== DEMANGLE_COMPONENT_OPERATOR
)
1561 di
->expansion
+= sizeof "operator" + ret
->u
.s_operator
.op
->len
- 2;
1562 if (!strcmp (ret
->u
.s_operator
.op
->code
, "li"))
1563 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_UNARY
, ret
,
1564 d_source_name (di
));
1567 else if (peek
== 'C' || peek
== 'D')
1568 ret
= d_ctor_dtor_name (di
);
1569 else if (peek
== 'L')
1573 ret
= d_source_name (di
);
1576 if (! d_discriminator (di
))
1579 else if (peek
== 'U')
1581 switch (d_peek_next_char (di
))
1584 ret
= d_lambda (di
);
1587 ret
= d_unnamed_type (di
);
1596 if (d_peek_char (di
) == 'B')
1597 ret
= d_abi_tags (di
, ret
);
1601 /* <source-name> ::= <(positive length) number> <identifier> */
1603 static struct demangle_component
*
1604 d_source_name (struct d_info
*di
)
1607 struct demangle_component
*ret
;
1609 len
= d_number (di
);
1612 ret
= d_identifier (di
, len
);
1613 di
->last_name
= ret
;
1617 /* number ::= [n] <(non-negative decimal integer)> */
1620 d_number (struct d_info
*di
)
1627 peek
= d_peek_char (di
);
1632 peek
= d_peek_char (di
);
1638 if (! IS_DIGIT (peek
))
1644 ret
= ret
* 10 + peek
- '0';
1646 peek
= d_peek_char (di
);
1650 /* Like d_number, but returns a demangle_component. */
1652 static struct demangle_component
*
1653 d_number_component (struct d_info
*di
)
1655 struct demangle_component
*ret
= d_make_empty (di
);
1658 ret
->type
= DEMANGLE_COMPONENT_NUMBER
;
1659 ret
->u
.s_number
.number
= d_number (di
);
1664 /* identifier ::= <(unqualified source code identifier)> */
1666 static struct demangle_component
*
1667 d_identifier (struct d_info
*di
, int len
)
1673 if (di
->send
- name
< len
)
1676 d_advance (di
, len
);
1678 /* A Java mangled name may have a trailing '$' if it is a C++
1679 keyword. This '$' is not included in the length count. We just
1681 if ((di
->options
& DMGL_JAVA
) != 0
1682 && d_peek_char (di
) == '$')
1685 /* Look for something which looks like a gcc encoding of an
1686 anonymous namespace, and replace it with a more user friendly
1688 if (len
>= (int) ANONYMOUS_NAMESPACE_PREFIX_LEN
+ 2
1689 && memcmp (name
, ANONYMOUS_NAMESPACE_PREFIX
,
1690 ANONYMOUS_NAMESPACE_PREFIX_LEN
) == 0)
1694 s
= name
+ ANONYMOUS_NAMESPACE_PREFIX_LEN
;
1695 if ((*s
== '.' || *s
== '_' || *s
== '$')
1698 di
->expansion
-= len
- sizeof "(anonymous namespace)";
1699 return d_make_name (di
, "(anonymous namespace)",
1700 sizeof "(anonymous namespace)" - 1);
1704 return d_make_name (di
, name
, len
);
1707 /* operator_name ::= many different two character encodings.
1709 ::= v <digit> <source-name>
1711 This list is sorted for binary search. */
1713 #define NL(s) s, (sizeof s) - 1
1715 CP_STATIC_IF_GLIBCPP_V3
1716 const struct demangle_operator_info cplus_demangle_operators
[] =
1718 { "aN", NL ("&="), 2 },
1719 { "aS", NL ("="), 2 },
1720 { "aa", NL ("&&"), 2 },
1721 { "ad", NL ("&"), 1 },
1722 { "an", NL ("&"), 2 },
1723 { "at", NL ("alignof "), 1 },
1724 { "az", NL ("alignof "), 1 },
1725 { "cc", NL ("const_cast"), 2 },
1726 { "cl", NL ("()"), 2 },
1727 { "cm", NL (","), 2 },
1728 { "co", NL ("~"), 1 },
1729 { "dV", NL ("/="), 2 },
1730 { "da", NL ("delete[] "), 1 },
1731 { "dc", NL ("dynamic_cast"), 2 },
1732 { "de", NL ("*"), 1 },
1733 { "dl", NL ("delete "), 1 },
1734 { "ds", NL (".*"), 2 },
1735 { "dt", NL ("."), 2 },
1736 { "dv", NL ("/"), 2 },
1737 { "eO", NL ("^="), 2 },
1738 { "eo", NL ("^"), 2 },
1739 { "eq", NL ("=="), 2 },
1740 { "ge", NL (">="), 2 },
1741 { "gs", NL ("::"), 1 },
1742 { "gt", NL (">"), 2 },
1743 { "ix", NL ("[]"), 2 },
1744 { "lS", NL ("<<="), 2 },
1745 { "le", NL ("<="), 2 },
1746 { "li", NL ("operator\"\" "), 1 },
1747 { "ls", NL ("<<"), 2 },
1748 { "lt", NL ("<"), 2 },
1749 { "mI", NL ("-="), 2 },
1750 { "mL", NL ("*="), 2 },
1751 { "mi", NL ("-"), 2 },
1752 { "ml", NL ("*"), 2 },
1753 { "mm", NL ("--"), 1 },
1754 { "na", NL ("new[]"), 3 },
1755 { "ne", NL ("!="), 2 },
1756 { "ng", NL ("-"), 1 },
1757 { "nt", NL ("!"), 1 },
1758 { "nw", NL ("new"), 3 },
1759 { "oR", NL ("|="), 2 },
1760 { "oo", NL ("||"), 2 },
1761 { "or", NL ("|"), 2 },
1762 { "pL", NL ("+="), 2 },
1763 { "pl", NL ("+"), 2 },
1764 { "pm", NL ("->*"), 2 },
1765 { "pp", NL ("++"), 1 },
1766 { "ps", NL ("+"), 1 },
1767 { "pt", NL ("->"), 2 },
1768 { "qu", NL ("?"), 3 },
1769 { "rM", NL ("%="), 2 },
1770 { "rS", NL (">>="), 2 },
1771 { "rc", NL ("reinterpret_cast"), 2 },
1772 { "rm", NL ("%"), 2 },
1773 { "rs", NL (">>"), 2 },
1774 { "sc", NL ("static_cast"), 2 },
1775 { "st", NL ("sizeof "), 1 },
1776 { "sz", NL ("sizeof "), 1 },
1777 { "tr", NL ("throw"), 0 },
1778 { "tw", NL ("throw "), 1 },
1779 { NULL
, NULL
, 0, 0 }
1782 static struct demangle_component
*
1783 d_operator_name (struct d_info
*di
)
1788 c1
= d_next_char (di
);
1789 c2
= d_next_char (di
);
1790 if (c1
== 'v' && IS_DIGIT (c2
))
1791 return d_make_extended_operator (di
, c2
- '0', d_source_name (di
));
1792 else if (c1
== 'c' && c2
== 'v')
1794 struct demangle_component
*type
;
1795 int was_conversion
= di
->is_conversion
;
1797 di
->is_conversion
= ! di
->is_expression
;
1798 type
= cplus_demangle_type (di
);
1799 di
->is_conversion
= was_conversion
;
1800 return d_make_comp (di
, DEMANGLE_COMPONENT_CAST
, type
, NULL
);
1804 /* LOW is the inclusive lower bound. */
1806 /* HIGH is the exclusive upper bound. We subtract one to ignore
1807 the sentinel at the end of the array. */
1808 int high
= ((sizeof (cplus_demangle_operators
)
1809 / sizeof (cplus_demangle_operators
[0]))
1815 const struct demangle_operator_info
*p
;
1817 i
= low
+ (high
- low
) / 2;
1818 p
= cplus_demangle_operators
+ i
;
1820 if (c1
== p
->code
[0] && c2
== p
->code
[1])
1821 return d_make_operator (di
, p
);
1823 if (c1
< p
->code
[0] || (c1
== p
->code
[0] && c2
< p
->code
[1]))
1833 static struct demangle_component
*
1834 d_make_character (struct d_info
*di
, int c
)
1836 struct demangle_component
*p
;
1837 p
= d_make_empty (di
);
1840 p
->type
= DEMANGLE_COMPONENT_CHARACTER
;
1841 p
->u
.s_character
.character
= c
;
1846 static struct demangle_component
*
1847 d_java_resource (struct d_info
*di
)
1849 struct demangle_component
*p
= NULL
;
1850 struct demangle_component
*next
= NULL
;
1855 len
= d_number (di
);
1859 /* Eat the leading '_'. */
1860 if (d_next_char (di
) != '_')
1873 /* Each chunk is either a '$' escape... */
1891 next
= d_make_character (di
, c
);
1899 /* ... or a sequence of characters. */
1902 while (i
< len
&& str
[i
] && str
[i
] != '$')
1905 next
= d_make_name (di
, str
, i
);
1918 p
= d_make_comp (di
, DEMANGLE_COMPONENT_COMPOUND_NAME
, p
, next
);
1924 p
= d_make_comp (di
, DEMANGLE_COMPONENT_JAVA_RESOURCE
, p
, NULL
);
1929 /* <special-name> ::= TV <type>
1933 ::= GV <(object) name>
1934 ::= T <call-offset> <(base) encoding>
1935 ::= Tc <call-offset> <call-offset> <(base) encoding>
1936 Also g++ extensions:
1937 ::= TC <type> <(offset) number> _ <(base) type>
1942 ::= Gr <resource name>
1947 static struct demangle_component
*
1948 d_special_name (struct d_info
*di
)
1950 di
->expansion
+= 20;
1951 if (d_check_char (di
, 'T'))
1953 switch (d_next_char (di
))
1957 return d_make_comp (di
, DEMANGLE_COMPONENT_VTABLE
,
1958 cplus_demangle_type (di
), NULL
);
1960 di
->expansion
-= 10;
1961 return d_make_comp (di
, DEMANGLE_COMPONENT_VTT
,
1962 cplus_demangle_type (di
), NULL
);
1964 return d_make_comp (di
, DEMANGLE_COMPONENT_TYPEINFO
,
1965 cplus_demangle_type (di
), NULL
);
1967 return d_make_comp (di
, DEMANGLE_COMPONENT_TYPEINFO_NAME
,
1968 cplus_demangle_type (di
), NULL
);
1971 if (! d_call_offset (di
, 'h'))
1973 return d_make_comp (di
, DEMANGLE_COMPONENT_THUNK
,
1974 d_encoding (di
, 0), NULL
);
1977 if (! d_call_offset (di
, 'v'))
1979 return d_make_comp (di
, DEMANGLE_COMPONENT_VIRTUAL_THUNK
,
1980 d_encoding (di
, 0), NULL
);
1983 if (! d_call_offset (di
, '\0'))
1985 if (! d_call_offset (di
, '\0'))
1987 return d_make_comp (di
, DEMANGLE_COMPONENT_COVARIANT_THUNK
,
1988 d_encoding (di
, 0), NULL
);
1992 struct demangle_component
*derived_type
;
1994 struct demangle_component
*base_type
;
1996 derived_type
= cplus_demangle_type (di
);
1997 offset
= d_number (di
);
2000 if (! d_check_char (di
, '_'))
2002 base_type
= cplus_demangle_type (di
);
2003 /* We don't display the offset. FIXME: We should display
2004 it in verbose mode. */
2006 return d_make_comp (di
, DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
,
2007 base_type
, derived_type
);
2011 return d_make_comp (di
, DEMANGLE_COMPONENT_TYPEINFO_FN
,
2012 cplus_demangle_type (di
), NULL
);
2014 return d_make_comp (di
, DEMANGLE_COMPONENT_JAVA_CLASS
,
2015 cplus_demangle_type (di
), NULL
);
2018 return d_make_comp (di
, DEMANGLE_COMPONENT_TLS_INIT
,
2022 return d_make_comp (di
, DEMANGLE_COMPONENT_TLS_WRAPPER
,
2029 else if (d_check_char (di
, 'G'))
2031 switch (d_next_char (di
))
2034 return d_make_comp (di
, DEMANGLE_COMPONENT_GUARD
, d_name (di
), NULL
);
2038 struct demangle_component
*name
= d_name (di
);
2039 return d_make_comp (di
, DEMANGLE_COMPONENT_REFTEMP
, name
,
2040 d_number_component (di
));
2044 return d_make_comp (di
, DEMANGLE_COMPONENT_HIDDEN_ALIAS
,
2045 d_encoding (di
, 0), NULL
);
2048 switch (d_next_char (di
))
2051 return d_make_comp (di
, DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
,
2052 d_encoding (di
, 0), NULL
);
2054 /* ??? The proposal is that other letters (such as 'h') stand
2055 for different variants of transaction cloning, such as
2056 compiling directly for hardware transaction support. But
2057 they still should all be transactional clones of some sort
2058 so go ahead and call them that. */
2060 return d_make_comp (di
, DEMANGLE_COMPONENT_TRANSACTION_CLONE
,
2061 d_encoding (di
, 0), NULL
);
2065 return d_java_resource (di
);
2075 /* <call-offset> ::= h <nv-offset> _
2078 <nv-offset> ::= <(offset) number>
2080 <v-offset> ::= <(offset) number> _ <(virtual offset) number>
2082 The C parameter, if not '\0', is a character we just read which is
2083 the start of the <call-offset>.
2085 We don't display the offset information anywhere. FIXME: We should
2086 display it in verbose mode. */
2089 d_call_offset (struct d_info
*di
, int c
)
2092 c
= d_next_char (di
);
2099 if (! d_check_char (di
, '_'))
2106 if (! d_check_char (di
, '_'))
2112 /* <ctor-dtor-name> ::= C1
2120 static struct demangle_component
*
2121 d_ctor_dtor_name (struct d_info
*di
)
2123 if (di
->last_name
!= NULL
)
2125 if (di
->last_name
->type
== DEMANGLE_COMPONENT_NAME
)
2126 di
->expansion
+= di
->last_name
->u
.s_name
.len
;
2127 else if (di
->last_name
->type
== DEMANGLE_COMPONENT_SUB_STD
)
2128 di
->expansion
+= di
->last_name
->u
.s_string
.len
;
2130 switch (d_peek_char (di
))
2134 enum gnu_v3_ctor_kinds kind
;
2136 switch (d_peek_next_char (di
))
2139 kind
= gnu_v3_complete_object_ctor
;
2142 kind
= gnu_v3_base_object_ctor
;
2145 kind
= gnu_v3_complete_object_allocating_ctor
;
2148 kind
= gnu_v3_unified_ctor
;
2151 kind
= gnu_v3_object_ctor_group
;
2157 return d_make_ctor (di
, kind
, di
->last_name
);
2162 enum gnu_v3_dtor_kinds kind
;
2164 switch (d_peek_next_char (di
))
2167 kind
= gnu_v3_deleting_dtor
;
2170 kind
= gnu_v3_complete_object_dtor
;
2173 kind
= gnu_v3_base_object_dtor
;
2175 /* digit '3' is not used */
2177 kind
= gnu_v3_unified_dtor
;
2180 kind
= gnu_v3_object_dtor_group
;
2186 return d_make_dtor (di
, kind
, di
->last_name
);
2194 /* <type> ::= <builtin-type>
2196 ::= <class-enum-type>
2198 ::= <pointer-to-member-type>
2199 ::= <template-param>
2200 ::= <template-template-param> <template-args>
2202 ::= <CV-qualifiers> <type>
2205 ::= O <type> (C++0x)
2208 ::= U <source-name> <type>
2210 <builtin-type> ::= various one letter codes
2214 CP_STATIC_IF_GLIBCPP_V3
2215 const struct demangle_builtin_type_info
2216 cplus_demangle_builtin_types
[D_BUILTIN_TYPE_COUNT
] =
2218 /* a */ { NL ("signed char"), NL ("signed char"), D_PRINT_DEFAULT
},
2219 /* b */ { NL ("bool"), NL ("boolean"), D_PRINT_BOOL
},
2220 /* c */ { NL ("char"), NL ("byte"), D_PRINT_DEFAULT
},
2221 /* d */ { NL ("double"), NL ("double"), D_PRINT_FLOAT
},
2222 /* e */ { NL ("long double"), NL ("long double"), D_PRINT_FLOAT
},
2223 /* f */ { NL ("float"), NL ("float"), D_PRINT_FLOAT
},
2224 /* g */ { NL ("__float128"), NL ("__float128"), D_PRINT_FLOAT
},
2225 /* h */ { NL ("unsigned char"), NL ("unsigned char"), D_PRINT_DEFAULT
},
2226 /* i */ { NL ("int"), NL ("int"), D_PRINT_INT
},
2227 /* j */ { NL ("unsigned int"), NL ("unsigned"), D_PRINT_UNSIGNED
},
2228 /* k */ { NULL
, 0, NULL
, 0, D_PRINT_DEFAULT
},
2229 /* l */ { NL ("long"), NL ("long"), D_PRINT_LONG
},
2230 /* m */ { NL ("unsigned long"), NL ("unsigned long"), D_PRINT_UNSIGNED_LONG
},
2231 /* n */ { NL ("__int128"), NL ("__int128"), D_PRINT_DEFAULT
},
2232 /* o */ { NL ("unsigned __int128"), NL ("unsigned __int128"),
2234 /* p */ { NULL
, 0, NULL
, 0, D_PRINT_DEFAULT
},
2235 /* q */ { NULL
, 0, NULL
, 0, D_PRINT_DEFAULT
},
2236 /* r */ { NULL
, 0, NULL
, 0, D_PRINT_DEFAULT
},
2237 /* s */ { NL ("short"), NL ("short"), D_PRINT_DEFAULT
},
2238 /* t */ { NL ("unsigned short"), NL ("unsigned short"), D_PRINT_DEFAULT
},
2239 /* u */ { NULL
, 0, NULL
, 0, D_PRINT_DEFAULT
},
2240 /* v */ { NL ("void"), NL ("void"), D_PRINT_VOID
},
2241 /* w */ { NL ("wchar_t"), NL ("char"), D_PRINT_DEFAULT
},
2242 /* x */ { NL ("long long"), NL ("long"), D_PRINT_LONG_LONG
},
2243 /* y */ { NL ("unsigned long long"), NL ("unsigned long long"),
2244 D_PRINT_UNSIGNED_LONG_LONG
},
2245 /* z */ { NL ("..."), NL ("..."), D_PRINT_DEFAULT
},
2246 /* 26 */ { NL ("decimal32"), NL ("decimal32"), D_PRINT_DEFAULT
},
2247 /* 27 */ { NL ("decimal64"), NL ("decimal64"), D_PRINT_DEFAULT
},
2248 /* 28 */ { NL ("decimal128"), NL ("decimal128"), D_PRINT_DEFAULT
},
2249 /* 29 */ { NL ("half"), NL ("half"), D_PRINT_FLOAT
},
2250 /* 30 */ { NL ("char16_t"), NL ("char16_t"), D_PRINT_DEFAULT
},
2251 /* 31 */ { NL ("char32_t"), NL ("char32_t"), D_PRINT_DEFAULT
},
2252 /* 32 */ { NL ("decltype(nullptr)"), NL ("decltype(nullptr)"),
2256 CP_STATIC_IF_GLIBCPP_V3
2257 struct demangle_component
*
2258 cplus_demangle_type (struct d_info
*di
)
2261 struct demangle_component
*ret
;
2264 /* The ABI specifies that when CV-qualifiers are used, the base type
2265 is substitutable, and the fully qualified type is substitutable,
2266 but the base type with a strict subset of the CV-qualifiers is
2267 not substitutable. The natural recursive implementation of the
2268 CV-qualifiers would cause subsets to be substitutable, so instead
2269 we pull them all off now.
2271 FIXME: The ABI says that order-insensitive vendor qualifiers
2272 should be handled in the same way, but we have no way to tell
2273 which vendor qualifiers are order-insensitive and which are
2274 order-sensitive. So we just assume that they are all
2275 order-sensitive. g++ 3.4 supports only one vendor qualifier,
2276 __vector, and it treats it as order-sensitive when mangling
2279 peek
= d_peek_char (di
);
2280 if (peek
== 'r' || peek
== 'V' || peek
== 'K')
2282 struct demangle_component
**pret
;
2284 pret
= d_cv_qualifiers (di
, &ret
, 0);
2287 if (d_peek_char (di
) == 'F')
2289 /* cv-qualifiers before a function type apply to 'this',
2290 so avoid adding the unqualified function type to
2291 the substitution list. */
2292 *pret
= d_function_type (di
);
2295 *pret
= cplus_demangle_type (di
);
2298 if ((*pret
)->type
== DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
2299 || (*pret
)->type
== DEMANGLE_COMPONENT_REFERENCE_THIS
)
2301 /* Move the ref-qualifier outside the cv-qualifiers so that
2302 they are printed in the right order. */
2303 struct demangle_component
*fn
= d_left (*pret
);
2304 d_left (*pret
) = ret
;
2308 if (! d_add_substitution (di
, ret
))
2317 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
2318 case 'h': case 'i': case 'j': case 'l': case 'm': case 'n':
2319 case 'o': case 's': case 't':
2320 case 'v': case 'w': case 'x': case 'y': case 'z':
2321 ret
= d_make_builtin_type (di
,
2322 &cplus_demangle_builtin_types
[peek
- 'a']);
2323 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2330 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_VENDOR_TYPE
,
2331 d_source_name (di
), NULL
);
2335 ret
= d_function_type (di
);
2338 case '0': case '1': case '2': case '3': case '4':
2339 case '5': case '6': case '7': case '8': case '9':
2342 ret
= d_class_enum_type (di
);
2346 ret
= d_array_type (di
);
2350 ret
= d_pointer_to_member_type (di
);
2354 ret
= d_template_param (di
);
2355 if (d_peek_char (di
) == 'I')
2357 /* This may be <template-template-param> <template-args>.
2358 If this is the type for a conversion operator, we can
2359 have a <template-template-param> here only by following
2360 a derivation like this:
2363 -> <template-prefix> <template-args>
2364 -> <prefix> <template-unqualified-name> <template-args>
2365 -> <unqualified-name> <template-unqualified-name> <template-args>
2366 -> <source-name> <template-unqualified-name> <template-args>
2367 -> <source-name> <operator-name> <template-args>
2368 -> <source-name> cv <type> <template-args>
2369 -> <source-name> cv <template-template-param> <template-args> <template-args>
2371 where the <template-args> is followed by another.
2372 Otherwise, we must have a derivation like this:
2375 -> <template-prefix> <template-args>
2376 -> <prefix> <template-unqualified-name> <template-args>
2377 -> <unqualified-name> <template-unqualified-name> <template-args>
2378 -> <source-name> <template-unqualified-name> <template-args>
2379 -> <source-name> <operator-name> <template-args>
2380 -> <source-name> cv <type> <template-args>
2381 -> <source-name> cv <template-param> <template-args>
2383 where we need to leave the <template-args> to be processed
2384 by d_prefix (following the <template-prefix>).
2386 The <template-template-param> part is a substitution
2388 if (! di
->is_conversion
)
2390 if (! d_add_substitution (di
, ret
))
2392 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, ret
,
2393 d_template_args (di
));
2397 struct demangle_component
*args
;
2398 struct d_info_checkpoint checkpoint
;
2400 d_checkpoint (di
, &checkpoint
);
2401 args
= d_template_args (di
);
2402 if (d_peek_char (di
) == 'I')
2404 if (! d_add_substitution (di
, ret
))
2406 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, ret
,
2410 d_backtrack (di
, &checkpoint
);
2416 /* If this is a special substitution, then it is the start of
2417 <class-enum-type>. */
2421 peek_next
= d_peek_next_char (di
);
2422 if (IS_DIGIT (peek_next
)
2424 || IS_UPPER (peek_next
))
2426 ret
= d_substitution (di
, 0);
2427 /* The substituted name may have been a template name and
2428 may be followed by tepmlate args. */
2429 if (d_peek_char (di
) == 'I')
2430 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, ret
,
2431 d_template_args (di
));
2437 ret
= d_class_enum_type (di
);
2438 /* If the substitution was a complete type, then it is not
2439 a new substitution candidate. However, if the
2440 substitution was followed by template arguments, then
2441 the whole thing is a substitution candidate. */
2442 if (ret
!= NULL
&& ret
->type
== DEMANGLE_COMPONENT_SUB_STD
)
2450 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_RVALUE_REFERENCE
,
2451 cplus_demangle_type (di
), NULL
);
2456 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_POINTER
,
2457 cplus_demangle_type (di
), NULL
);
2462 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_REFERENCE
,
2463 cplus_demangle_type (di
), NULL
);
2468 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_COMPLEX
,
2469 cplus_demangle_type (di
), NULL
);
2474 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_IMAGINARY
,
2475 cplus_demangle_type (di
), NULL
);
2480 ret
= d_source_name (di
);
2481 if (d_peek_char (di
) == 'I')
2482 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, ret
,
2483 d_template_args (di
));
2484 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
,
2485 cplus_demangle_type (di
), ret
);
2491 peek
= d_next_char (di
);
2496 /* decltype (expression) */
2497 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_DECLTYPE
,
2498 d_expression (di
), NULL
);
2499 if (ret
&& d_next_char (di
) != 'E')
2505 /* Pack expansion. */
2506 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_PACK_EXPANSION
,
2507 cplus_demangle_type (di
), NULL
);
2513 ret
= d_make_name (di
, "auto", 4);
2517 /* 32-bit decimal floating point */
2518 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[26]);
2519 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2523 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[27]);
2524 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2528 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[28]);
2529 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2532 /* 16-bit half-precision FP */
2533 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[29]);
2534 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2538 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[30]);
2539 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2543 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[31]);
2544 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2548 /* Fixed point types. DF<int bits><length><fract bits><sat> */
2549 ret
= d_make_empty (di
);
2550 ret
->type
= DEMANGLE_COMPONENT_FIXED_TYPE
;
2551 if ((ret
->u
.s_fixed
.accum
= IS_DIGIT (d_peek_char (di
))))
2552 /* For demangling we don't care about the bits. */
2554 ret
->u
.s_fixed
.length
= cplus_demangle_type (di
);
2555 if (ret
->u
.s_fixed
.length
== NULL
)
2558 peek
= d_next_char (di
);
2559 ret
->u
.s_fixed
.sat
= (peek
== 's');
2563 ret
= d_vector_type (di
);
2568 /* decltype(nullptr) */
2569 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[32]);
2570 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2584 if (! d_add_substitution (di
, ret
))
2591 /* <CV-qualifiers> ::= [r] [V] [K] */
2593 static struct demangle_component
**
2594 d_cv_qualifiers (struct d_info
*di
,
2595 struct demangle_component
**pret
, int member_fn
)
2597 struct demangle_component
**pstart
;
2601 peek
= d_peek_char (di
);
2602 while (peek
== 'r' || peek
== 'V' || peek
== 'K')
2604 enum demangle_component_type t
;
2610 ? DEMANGLE_COMPONENT_RESTRICT_THIS
2611 : DEMANGLE_COMPONENT_RESTRICT
);
2612 di
->expansion
+= sizeof "restrict";
2614 else if (peek
== 'V')
2617 ? DEMANGLE_COMPONENT_VOLATILE_THIS
2618 : DEMANGLE_COMPONENT_VOLATILE
);
2619 di
->expansion
+= sizeof "volatile";
2624 ? DEMANGLE_COMPONENT_CONST_THIS
2625 : DEMANGLE_COMPONENT_CONST
);
2626 di
->expansion
+= sizeof "const";
2629 *pret
= d_make_comp (di
, t
, NULL
, NULL
);
2632 pret
= &d_left (*pret
);
2634 peek
= d_peek_char (di
);
2637 if (!member_fn
&& peek
== 'F')
2639 while (pstart
!= pret
)
2641 switch ((*pstart
)->type
)
2643 case DEMANGLE_COMPONENT_RESTRICT
:
2644 (*pstart
)->type
= DEMANGLE_COMPONENT_RESTRICT_THIS
;
2646 case DEMANGLE_COMPONENT_VOLATILE
:
2647 (*pstart
)->type
= DEMANGLE_COMPONENT_VOLATILE_THIS
;
2649 case DEMANGLE_COMPONENT_CONST
:
2650 (*pstart
)->type
= DEMANGLE_COMPONENT_CONST_THIS
;
2655 pstart
= &d_left (*pstart
);
2662 /* <ref-qualifier> ::= R
2665 static struct demangle_component
*
2666 d_ref_qualifier (struct d_info
*di
, struct demangle_component
*sub
)
2668 struct demangle_component
*ret
= sub
;
2671 peek
= d_peek_char (di
);
2672 if (peek
== 'R' || peek
== 'O')
2674 enum demangle_component_type t
;
2677 t
= DEMANGLE_COMPONENT_REFERENCE_THIS
;
2678 di
->expansion
+= sizeof "&";
2682 t
= DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
;
2683 di
->expansion
+= sizeof "&&";
2687 ret
= d_make_comp (di
, t
, ret
, NULL
);
2693 /* <function-type> ::= F [Y] <bare-function-type> [<ref-qualifier>] E */
2695 static struct demangle_component
*
2696 d_function_type (struct d_info
*di
)
2698 struct demangle_component
*ret
;
2700 if (! d_check_char (di
, 'F'))
2702 if (d_peek_char (di
) == 'Y')
2704 /* Function has C linkage. We don't print this information.
2705 FIXME: We should print it in verbose mode. */
2708 ret
= d_bare_function_type (di
, 1);
2709 ret
= d_ref_qualifier (di
, ret
);
2711 if (! d_check_char (di
, 'E'))
2718 static struct demangle_component
*
2719 d_parmlist (struct d_info
*di
)
2721 struct demangle_component
*tl
;
2722 struct demangle_component
**ptl
;
2728 struct demangle_component
*type
;
2730 char peek
= d_peek_char (di
);
2731 if (peek
== '\0' || peek
== 'E' || peek
== '.')
2733 if ((peek
== 'R' || peek
== 'O')
2734 && d_peek_next_char (di
) == 'E')
2735 /* Function ref-qualifier, not a ref prefix for a parameter type. */
2737 type
= cplus_demangle_type (di
);
2740 *ptl
= d_make_comp (di
, DEMANGLE_COMPONENT_ARGLIST
, type
, NULL
);
2743 ptl
= &d_right (*ptl
);
2746 /* There should be at least one parameter type besides the optional
2747 return type. A function which takes no arguments will have a
2748 single parameter type void. */
2752 /* If we have a single parameter type void, omit it. */
2753 if (d_right (tl
) == NULL
2754 && d_left (tl
)->type
== DEMANGLE_COMPONENT_BUILTIN_TYPE
2755 && d_left (tl
)->u
.s_builtin
.type
->print
== D_PRINT_VOID
)
2757 di
->expansion
-= d_left (tl
)->u
.s_builtin
.type
->len
;
2764 /* <bare-function-type> ::= [J]<type>+ */
2766 static struct demangle_component
*
2767 d_bare_function_type (struct d_info
*di
, int has_return_type
)
2769 struct demangle_component
*return_type
;
2770 struct demangle_component
*tl
;
2773 /* Detect special qualifier indicating that the first argument
2774 is the return type. */
2775 peek
= d_peek_char (di
);
2779 has_return_type
= 1;
2782 if (has_return_type
)
2784 return_type
= cplus_demangle_type (di
);
2785 if (return_type
== NULL
)
2791 tl
= d_parmlist (di
);
2795 return d_make_comp (di
, DEMANGLE_COMPONENT_FUNCTION_TYPE
,
2799 /* <class-enum-type> ::= <name> */
2801 static struct demangle_component
*
2802 d_class_enum_type (struct d_info
*di
)
2807 /* <array-type> ::= A <(positive dimension) number> _ <(element) type>
2808 ::= A [<(dimension) expression>] _ <(element) type>
2811 static struct demangle_component
*
2812 d_array_type (struct d_info
*di
)
2815 struct demangle_component
*dim
;
2817 if (! d_check_char (di
, 'A'))
2820 peek
= d_peek_char (di
);
2823 else if (IS_DIGIT (peek
))
2831 peek
= d_peek_char (di
);
2833 while (IS_DIGIT (peek
));
2834 dim
= d_make_name (di
, s
, d_str (di
) - s
);
2840 dim
= d_expression (di
);
2845 if (! d_check_char (di
, '_'))
2848 return d_make_comp (di
, DEMANGLE_COMPONENT_ARRAY_TYPE
, dim
,
2849 cplus_demangle_type (di
));
2852 /* <vector-type> ::= Dv <number> _ <type>
2853 ::= Dv _ <expression> _ <type> */
2855 static struct demangle_component
*
2856 d_vector_type (struct d_info
*di
)
2859 struct demangle_component
*dim
;
2861 peek
= d_peek_char (di
);
2865 dim
= d_expression (di
);
2868 dim
= d_number_component (di
);
2873 if (! d_check_char (di
, '_'))
2876 return d_make_comp (di
, DEMANGLE_COMPONENT_VECTOR_TYPE
, dim
,
2877 cplus_demangle_type (di
));
2880 /* <pointer-to-member-type> ::= M <(class) type> <(member) type> */
2882 static struct demangle_component
*
2883 d_pointer_to_member_type (struct d_info
*di
)
2885 struct demangle_component
*cl
;
2886 struct demangle_component
*mem
;
2888 if (! d_check_char (di
, 'M'))
2891 cl
= cplus_demangle_type (di
);
2895 /* The ABI says, "The type of a non-static member function is considered
2896 to be different, for the purposes of substitution, from the type of a
2897 namespace-scope or static member function whose type appears
2898 similar. The types of two non-static member functions are considered
2899 to be different, for the purposes of substitution, if the functions
2900 are members of different classes. In other words, for the purposes of
2901 substitution, the class of which the function is a member is
2902 considered part of the type of function."
2904 For a pointer to member function, this call to cplus_demangle_type
2905 will end up adding a (possibly qualified) non-member function type to
2906 the substitution table, which is not correct; however, the member
2907 function type will never be used in a substitution, so putting the
2908 wrong type in the substitution table is harmless. */
2910 mem
= cplus_demangle_type (di
);
2914 return d_make_comp (di
, DEMANGLE_COMPONENT_PTRMEM_TYPE
, cl
, mem
);
2917 /* <non-negative number> _ */
2920 d_compact_number (struct d_info
*di
)
2923 if (d_peek_char (di
) == '_')
2925 else if (d_peek_char (di
) == 'n')
2928 num
= d_number (di
) + 1;
2930 if (! d_check_char (di
, '_'))
2935 /* <template-param> ::= T_
2936 ::= T <(parameter-2 non-negative) number> _
2939 static struct demangle_component
*
2940 d_template_param (struct d_info
*di
)
2944 if (! d_check_char (di
, 'T'))
2947 param
= d_compact_number (di
);
2953 return d_make_template_param (di
, param
);
2956 /* <template-args> ::= I <template-arg>+ E */
2958 static struct demangle_component
*
2959 d_template_args (struct d_info
*di
)
2961 struct demangle_component
*hold_last_name
;
2962 struct demangle_component
*al
;
2963 struct demangle_component
**pal
;
2965 /* Preserve the last name we saw--don't let the template arguments
2966 clobber it, as that would give us the wrong name for a subsequent
2967 constructor or destructor. */
2968 hold_last_name
= di
->last_name
;
2970 if (d_peek_char (di
) != 'I'
2971 && d_peek_char (di
) != 'J')
2975 if (d_peek_char (di
) == 'E')
2977 /* An argument pack can be empty. */
2979 return d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
, NULL
, NULL
);
2986 struct demangle_component
*a
;
2988 a
= d_template_arg (di
);
2992 *pal
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
, a
, NULL
);
2995 pal
= &d_right (*pal
);
2997 if (d_peek_char (di
) == 'E')
3004 di
->last_name
= hold_last_name
;
3009 /* <template-arg> ::= <type>
3010 ::= X <expression> E
3014 static struct demangle_component
*
3015 d_template_arg (struct d_info
*di
)
3017 struct demangle_component
*ret
;
3019 switch (d_peek_char (di
))
3023 ret
= d_expression (di
);
3024 if (! d_check_char (di
, 'E'))
3029 return d_expr_primary (di
);
3033 /* An argument pack. */
3034 return d_template_args (di
);
3037 return cplus_demangle_type (di
);
3041 /* Parse a sequence of expressions until we hit the terminator
3044 static struct demangle_component
*
3045 d_exprlist (struct d_info
*di
, char terminator
)
3047 struct demangle_component
*list
= NULL
;
3048 struct demangle_component
**p
= &list
;
3050 if (d_peek_char (di
) == terminator
)
3053 return d_make_comp (di
, DEMANGLE_COMPONENT_ARGLIST
, NULL
, NULL
);
3058 struct demangle_component
*arg
= d_expression (di
);
3062 *p
= d_make_comp (di
, DEMANGLE_COMPONENT_ARGLIST
, arg
, NULL
);
3067 if (d_peek_char (di
) == terminator
)
3077 /* Returns nonzero iff OP is an operator for a C++ cast: const_cast,
3078 dynamic_cast, static_cast or reinterpret_cast. */
3081 op_is_new_cast (struct demangle_component
*op
)
3083 const char *code
= op
->u
.s_operator
.op
->code
;
3084 return (code
[1] == 'c'
3085 && (code
[0] == 's' || code
[0] == 'd'
3086 || code
[0] == 'c' || code
[0] == 'r'));
3089 /* <expression> ::= <(unary) operator-name> <expression>
3090 ::= <(binary) operator-name> <expression> <expression>
3091 ::= <(trinary) operator-name> <expression> <expression> <expression>
3092 ::= cl <expression>+ E
3094 ::= <template-param>
3095 ::= sr <type> <unqualified-name>
3096 ::= sr <type> <unqualified-name> <template-args>
3100 static inline struct demangle_component
*
3101 d_expression_1 (struct d_info
*di
)
3105 peek
= d_peek_char (di
);
3107 return d_expr_primary (di
);
3108 else if (peek
== 'T')
3109 return d_template_param (di
);
3110 else if (peek
== 's' && d_peek_next_char (di
) == 'r')
3112 struct demangle_component
*type
;
3113 struct demangle_component
*name
;
3116 type
= cplus_demangle_type (di
);
3117 name
= d_unqualified_name (di
);
3118 if (d_peek_char (di
) != 'I')
3119 return d_make_comp (di
, DEMANGLE_COMPONENT_QUAL_NAME
, type
, name
);
3121 return d_make_comp (di
, DEMANGLE_COMPONENT_QUAL_NAME
, type
,
3122 d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, name
,
3123 d_template_args (di
)));
3125 else if (peek
== 's' && d_peek_next_char (di
) == 'p')
3128 return d_make_comp (di
, DEMANGLE_COMPONENT_PACK_EXPANSION
,
3129 d_expression_1 (di
), NULL
);
3131 else if (peek
== 'f' && d_peek_next_char (di
) == 'p')
3133 /* Function parameter used in a late-specified return type. */
3136 if (d_peek_char (di
) == 'T')
3138 /* 'this' parameter. */
3144 index
= d_compact_number (di
) + 1;
3148 return d_make_function_param (di
, index
);
3150 else if (IS_DIGIT (peek
)
3151 || (peek
== 'o' && d_peek_next_char (di
) == 'n'))
3153 /* We can get an unqualified name as an expression in the case of
3154 a dependent function call, i.e. decltype(f(t)). */
3155 struct demangle_component
*name
;
3158 /* operator-function-id, i.e. operator+(t). */
3161 name
= d_unqualified_name (di
);
3164 if (d_peek_char (di
) == 'I')
3165 return d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, name
,
3166 d_template_args (di
));
3170 else if ((peek
== 'i' || peek
== 't')
3171 && d_peek_next_char (di
) == 'l')
3173 /* Brace-enclosed initializer list, untyped or typed. */
3174 struct demangle_component
*type
= NULL
;
3176 type
= cplus_demangle_type (di
);
3178 return d_make_comp (di
, DEMANGLE_COMPONENT_INITIALIZER_LIST
,
3179 type
, d_exprlist (di
, 'E'));
3183 struct demangle_component
*op
;
3184 const char *code
= NULL
;
3187 op
= d_operator_name (di
);
3191 if (op
->type
== DEMANGLE_COMPONENT_OPERATOR
)
3193 code
= op
->u
.s_operator
.op
->code
;
3194 di
->expansion
+= op
->u
.s_operator
.op
->len
- 2;
3195 if (strcmp (code
, "st") == 0)
3196 return d_make_comp (di
, DEMANGLE_COMPONENT_UNARY
, op
,
3197 cplus_demangle_type (di
));
3204 case DEMANGLE_COMPONENT_OPERATOR
:
3205 args
= op
->u
.s_operator
.op
->args
;
3207 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
3208 args
= op
->u
.s_extended_operator
.args
;
3210 case DEMANGLE_COMPONENT_CAST
:
3218 return d_make_comp (di
, DEMANGLE_COMPONENT_NULLARY
, op
, NULL
);
3222 struct demangle_component
*operand
;
3225 if (code
&& (code
[0] == 'p' || code
[0] == 'm')
3226 && code
[1] == code
[0])
3227 /* pp_ and mm_ are the prefix variants. */
3228 suffix
= !d_check_char (di
, '_');
3230 if (op
->type
== DEMANGLE_COMPONENT_CAST
3231 && d_check_char (di
, '_'))
3232 operand
= d_exprlist (di
, 'E');
3234 operand
= d_expression_1 (di
);
3237 /* Indicate the suffix variant for d_print_comp. */
3238 return d_make_comp (di
, DEMANGLE_COMPONENT_UNARY
, op
,
3240 DEMANGLE_COMPONENT_BINARY_ARGS
,
3243 return d_make_comp (di
, DEMANGLE_COMPONENT_UNARY
, op
,
3248 struct demangle_component
*left
;
3249 struct demangle_component
*right
;
3251 if (op_is_new_cast (op
))
3252 left
= cplus_demangle_type (di
);
3254 left
= d_expression_1 (di
);
3255 if (!strcmp (code
, "cl"))
3256 right
= d_exprlist (di
, 'E');
3257 else if (!strcmp (code
, "dt") || !strcmp (code
, "pt"))
3259 right
= d_unqualified_name (di
);
3260 if (d_peek_char (di
) == 'I')
3261 right
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
,
3262 right
, d_template_args (di
));
3265 right
= d_expression_1 (di
);
3267 return d_make_comp (di
, DEMANGLE_COMPONENT_BINARY
, op
,
3269 DEMANGLE_COMPONENT_BINARY_ARGS
,
3274 struct demangle_component
*first
;
3275 struct demangle_component
*second
;
3276 struct demangle_component
*third
;
3278 if (!strcmp (code
, "qu"))
3280 /* ?: expression. */
3281 first
= d_expression_1 (di
);
3282 second
= d_expression_1 (di
);
3283 third
= d_expression_1 (di
);
3285 else if (code
[0] == 'n')
3287 /* new-expression. */
3288 if (code
[1] != 'w' && code
[1] != 'a')
3290 first
= d_exprlist (di
, '_');
3291 second
= cplus_demangle_type (di
);
3292 if (d_peek_char (di
) == 'E')
3297 else if (d_peek_char (di
) == 'p'
3298 && d_peek_next_char (di
) == 'i')
3300 /* Parenthesized initializer. */
3302 third
= d_exprlist (di
, 'E');
3304 else if (d_peek_char (di
) == 'i'
3305 && d_peek_next_char (di
) == 'l')
3306 /* initializer-list. */
3307 third
= d_expression_1 (di
);
3313 return d_make_comp (di
, DEMANGLE_COMPONENT_TRINARY
, op
,
3315 DEMANGLE_COMPONENT_TRINARY_ARG1
,
3318 DEMANGLE_COMPONENT_TRINARY_ARG2
,
3327 static struct demangle_component
*
3328 d_expression (struct d_info
*di
)
3330 struct demangle_component
*ret
;
3331 int was_expression
= di
->is_expression
;
3333 di
->is_expression
= 1;
3334 ret
= d_expression_1 (di
);
3335 di
->is_expression
= was_expression
;
3339 /* <expr-primary> ::= L <type> <(value) number> E
3340 ::= L <type> <(value) float> E
3341 ::= L <mangled-name> E
3344 static struct demangle_component
*
3345 d_expr_primary (struct d_info
*di
)
3347 struct demangle_component
*ret
;
3349 if (! d_check_char (di
, 'L'))
3351 if (d_peek_char (di
) == '_'
3352 /* Workaround for G++ bug; see comment in write_template_arg. */
3353 || d_peek_char (di
) == 'Z')
3354 ret
= cplus_demangle_mangled_name (di
, 0);
3357 struct demangle_component
*type
;
3358 enum demangle_component_type t
;
3361 type
= cplus_demangle_type (di
);
3365 /* If we have a type we know how to print, we aren't going to
3366 print the type name itself. */
3367 if (type
->type
== DEMANGLE_COMPONENT_BUILTIN_TYPE
3368 && type
->u
.s_builtin
.type
->print
!= D_PRINT_DEFAULT
)
3369 di
->expansion
-= type
->u
.s_builtin
.type
->len
;
3371 /* Rather than try to interpret the literal value, we just
3372 collect it as a string. Note that it's possible to have a
3373 floating point literal here. The ABI specifies that the
3374 format of such literals is machine independent. That's fine,
3375 but what's not fine is that versions of g++ up to 3.2 with
3376 -fabi-version=1 used upper case letters in the hex constant,
3377 and dumped out gcc's internal representation. That makes it
3378 hard to tell where the constant ends, and hard to dump the
3379 constant in any readable form anyhow. We don't attempt to
3380 handle these cases. */
3382 t
= DEMANGLE_COMPONENT_LITERAL
;
3383 if (d_peek_char (di
) == 'n')
3385 t
= DEMANGLE_COMPONENT_LITERAL_NEG
;
3389 while (d_peek_char (di
) != 'E')
3391 if (d_peek_char (di
) == '\0')
3395 ret
= d_make_comp (di
, t
, type
, d_make_name (di
, s
, d_str (di
) - s
));
3397 if (! d_check_char (di
, 'E'))
3402 /* <local-name> ::= Z <(function) encoding> E <(entity) name> [<discriminator>]
3403 ::= Z <(function) encoding> E s [<discriminator>]
3404 ::= Z <(function) encoding> E d [<parameter> number>] _ <entity name>
3407 static struct demangle_component
*
3408 d_local_name (struct d_info
*di
)
3410 struct demangle_component
*function
;
3412 if (! d_check_char (di
, 'Z'))
3415 function
= d_encoding (di
, 0);
3417 if (! d_check_char (di
, 'E'))
3420 if (d_peek_char (di
) == 's')
3423 if (! d_discriminator (di
))
3425 return d_make_comp (di
, DEMANGLE_COMPONENT_LOCAL_NAME
, function
,
3426 d_make_name (di
, "string literal",
3427 sizeof "string literal" - 1));
3431 struct demangle_component
*name
;
3434 if (d_peek_char (di
) == 'd')
3436 /* Default argument scope: d <number> _. */
3438 num
= d_compact_number (di
);
3447 /* Lambdas and unnamed types have internal discriminators. */
3448 case DEMANGLE_COMPONENT_LAMBDA
:
3449 case DEMANGLE_COMPONENT_UNNAMED_TYPE
:
3452 if (! d_discriminator (di
))
3456 name
= d_make_default_arg (di
, num
, name
);
3457 return d_make_comp (di
, DEMANGLE_COMPONENT_LOCAL_NAME
, function
, name
);
3461 /* <discriminator> ::= _ <(non-negative) number>
3463 We demangle the discriminator, but we don't print it out. FIXME:
3464 We should print it out in verbose mode. */
3467 d_discriminator (struct d_info
*di
)
3471 if (d_peek_char (di
) != '_')
3474 discrim
= d_number (di
);
3480 /* <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _ */
3482 static struct demangle_component
*
3483 d_lambda (struct d_info
*di
)
3485 struct demangle_component
*tl
;
3486 struct demangle_component
*ret
;
3489 if (! d_check_char (di
, 'U'))
3491 if (! d_check_char (di
, 'l'))
3494 tl
= d_parmlist (di
);
3498 if (! d_check_char (di
, 'E'))
3501 num
= d_compact_number (di
);
3505 ret
= d_make_empty (di
);
3508 ret
->type
= DEMANGLE_COMPONENT_LAMBDA
;
3509 ret
->u
.s_unary_num
.sub
= tl
;
3510 ret
->u
.s_unary_num
.num
= num
;
3513 if (! d_add_substitution (di
, ret
))
3519 /* <unnamed-type-name> ::= Ut [ <nonnegative number> ] _ */
3521 static struct demangle_component
*
3522 d_unnamed_type (struct d_info
*di
)
3524 struct demangle_component
*ret
;
3527 if (! d_check_char (di
, 'U'))
3529 if (! d_check_char (di
, 't'))
3532 num
= d_compact_number (di
);
3536 ret
= d_make_empty (di
);
3539 ret
->type
= DEMANGLE_COMPONENT_UNNAMED_TYPE
;
3540 ret
->u
.s_number
.number
= num
;
3543 if (! d_add_substitution (di
, ret
))
3549 /* <clone-suffix> ::= [ . <clone-type-identifier> ] [ . <nonnegative number> ]*
3552 static struct demangle_component
*
3553 d_clone_suffix (struct d_info
*di
, struct demangle_component
*encoding
)
3555 const char *suffix
= d_str (di
);
3556 const char *pend
= suffix
;
3557 struct demangle_component
*n
;
3559 if (*pend
== '.' && (IS_LOWER (pend
[1]) || pend
[1] == '_'))
3562 while (IS_LOWER (*pend
) || *pend
== '_')
3565 while (*pend
== '.' && IS_DIGIT (pend
[1]))
3568 while (IS_DIGIT (*pend
))
3571 d_advance (di
, pend
- suffix
);
3572 n
= d_make_name (di
, suffix
, pend
- suffix
);
3573 return d_make_comp (di
, DEMANGLE_COMPONENT_CLONE
, encoding
, n
);
3576 /* Add a new substitution. */
3579 d_add_substitution (struct d_info
*di
, struct demangle_component
*dc
)
3583 if (di
->next_sub
>= di
->num_subs
)
3585 di
->subs
[di
->next_sub
] = dc
;
3590 /* <substitution> ::= S <seq-id> _
3600 If PREFIX is non-zero, then this type is being used as a prefix in
3601 a qualified name. In this case, for the standard substitutions, we
3602 need to check whether we are being used as a prefix for a
3603 constructor or destructor, and return a full template name.
3604 Otherwise we will get something like std::iostream::~iostream()
3605 which does not correspond particularly well to any function which
3606 actually appears in the source.
3609 static const struct d_standard_sub_info standard_subs
[] =
3614 { 'a', NL ("std::allocator"),
3615 NL ("std::allocator"),
3617 { 'b', NL ("std::basic_string"),
3618 NL ("std::basic_string"),
3619 NL ("basic_string") },
3620 { 's', NL ("std::string"),
3621 NL ("std::basic_string<char, std::char_traits<char>, std::allocator<char> >"),
3622 NL ("basic_string") },
3623 { 'i', NL ("std::istream"),
3624 NL ("std::basic_istream<char, std::char_traits<char> >"),
3625 NL ("basic_istream") },
3626 { 'o', NL ("std::ostream"),
3627 NL ("std::basic_ostream<char, std::char_traits<char> >"),
3628 NL ("basic_ostream") },
3629 { 'd', NL ("std::iostream"),
3630 NL ("std::basic_iostream<char, std::char_traits<char> >"),
3631 NL ("basic_iostream") }
3634 static struct demangle_component
*
3635 d_substitution (struct d_info
*di
, int prefix
)
3639 if (! d_check_char (di
, 'S'))
3642 c
= d_next_char (di
);
3643 if (c
== '_' || IS_DIGIT (c
) || IS_UPPER (c
))
3652 unsigned int new_id
;
3655 new_id
= id
* 36 + c
- '0';
3656 else if (IS_UPPER (c
))
3657 new_id
= id
* 36 + c
- 'A' + 10;
3663 c
= d_next_char (di
);
3670 if (id
>= (unsigned int) di
->next_sub
)
3675 return di
->subs
[id
];
3680 const struct d_standard_sub_info
*p
;
3681 const struct d_standard_sub_info
*pend
;
3683 verbose
= (di
->options
& DMGL_VERBOSE
) != 0;
3684 if (! verbose
&& prefix
)
3688 peek
= d_peek_char (di
);
3689 if (peek
== 'C' || peek
== 'D')
3693 pend
= (&standard_subs
[0]
3694 + sizeof standard_subs
/ sizeof standard_subs
[0]);
3695 for (p
= &standard_subs
[0]; p
< pend
; ++p
)
3701 struct demangle_component
*c
;
3703 if (p
->set_last_name
!= NULL
)
3704 di
->last_name
= d_make_sub (di
, p
->set_last_name
,
3705 p
->set_last_name_len
);
3708 s
= p
->full_expansion
;
3713 s
= p
->simple_expansion
;
3714 len
= p
->simple_len
;
3716 di
->expansion
+= len
;
3717 c
= d_make_sub (di
, s
, len
);
3718 if (d_peek_char (di
) == 'B')
3720 /* If there are ABI tags on the abbreviation, it becomes
3721 a substitution candidate. */
3722 c
= d_abi_tags (di
, c
);
3723 d_add_substitution (di
, c
);
3734 d_checkpoint (struct d_info
*di
, struct d_info_checkpoint
*checkpoint
)
3736 checkpoint
->n
= di
->n
;
3737 checkpoint
->next_comp
= di
->next_comp
;
3738 checkpoint
->next_sub
= di
->next_sub
;
3739 checkpoint
->did_subs
= di
->did_subs
;
3740 checkpoint
->expansion
= di
->expansion
;
3744 d_backtrack (struct d_info
*di
, struct d_info_checkpoint
*checkpoint
)
3746 di
->n
= checkpoint
->n
;
3747 di
->next_comp
= checkpoint
->next_comp
;
3748 di
->next_sub
= checkpoint
->next_sub
;
3749 di
->did_subs
= checkpoint
->did_subs
;
3750 di
->expansion
= checkpoint
->expansion
;
3753 /* Initialize a growable string. */
3756 d_growable_string_init (struct d_growable_string
*dgs
, size_t estimate
)
3761 dgs
->allocation_failure
= 0;
3764 d_growable_string_resize (dgs
, estimate
);
3767 /* Grow a growable string to a given size. */
3770 d_growable_string_resize (struct d_growable_string
*dgs
, size_t need
)
3775 if (dgs
->allocation_failure
)
3778 /* Start allocation at two bytes to avoid any possibility of confusion
3779 with the special value of 1 used as a return in *palc to indicate
3780 allocation failures. */
3781 newalc
= dgs
->alc
> 0 ? dgs
->alc
: 2;
3782 while (newalc
< need
)
3785 newbuf
= (char *) realloc (dgs
->buf
, newalc
);
3792 dgs
->allocation_failure
= 1;
3799 /* Append a buffer to a growable string. */
3802 d_growable_string_append_buffer (struct d_growable_string
*dgs
,
3803 const char *s
, size_t l
)
3807 need
= dgs
->len
+ l
+ 1;
3808 if (need
> dgs
->alc
)
3809 d_growable_string_resize (dgs
, need
);
3811 if (dgs
->allocation_failure
)
3814 memcpy (dgs
->buf
+ dgs
->len
, s
, l
);
3815 dgs
->buf
[dgs
->len
+ l
] = '\0';
3819 /* Bridge growable strings to the callback mechanism. */
3822 d_growable_string_callback_adapter (const char *s
, size_t l
, void *opaque
)
3824 struct d_growable_string
*dgs
= (struct d_growable_string
*) opaque
;
3826 d_growable_string_append_buffer (dgs
, s
, l
);
3829 /* Walk the tree, counting the number of templates encountered, and
3830 the number of times a scope might be saved. These counts will be
3831 used to allocate data structures for d_print_comp, so the logic
3832 here must mirror the logic d_print_comp will use. It is not
3833 important that the resulting numbers are exact, so long as they
3834 are larger than the actual numbers encountered. */
3837 d_count_templates_scopes (int *num_templates
, int *num_scopes
,
3838 const struct demangle_component
*dc
)
3845 case DEMANGLE_COMPONENT_NAME
:
3846 case DEMANGLE_COMPONENT_TEMPLATE_PARAM
:
3847 case DEMANGLE_COMPONENT_FUNCTION_PARAM
:
3848 case DEMANGLE_COMPONENT_SUB_STD
:
3849 case DEMANGLE_COMPONENT_BUILTIN_TYPE
:
3850 case DEMANGLE_COMPONENT_OPERATOR
:
3851 case DEMANGLE_COMPONENT_CHARACTER
:
3852 case DEMANGLE_COMPONENT_NUMBER
:
3853 case DEMANGLE_COMPONENT_UNNAMED_TYPE
:
3856 case DEMANGLE_COMPONENT_TEMPLATE
:
3858 goto recurse_left_right
;
3860 case DEMANGLE_COMPONENT_REFERENCE
:
3861 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
3862 if (d_left (dc
)->type
== DEMANGLE_COMPONENT_TEMPLATE_PARAM
)
3864 goto recurse_left_right
;
3866 case DEMANGLE_COMPONENT_QUAL_NAME
:
3867 case DEMANGLE_COMPONENT_LOCAL_NAME
:
3868 case DEMANGLE_COMPONENT_TYPED_NAME
:
3869 case DEMANGLE_COMPONENT_VTABLE
:
3870 case DEMANGLE_COMPONENT_VTT
:
3871 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
:
3872 case DEMANGLE_COMPONENT_TYPEINFO
:
3873 case DEMANGLE_COMPONENT_TYPEINFO_NAME
:
3874 case DEMANGLE_COMPONENT_TYPEINFO_FN
:
3875 case DEMANGLE_COMPONENT_THUNK
:
3876 case DEMANGLE_COMPONENT_VIRTUAL_THUNK
:
3877 case DEMANGLE_COMPONENT_COVARIANT_THUNK
:
3878 case DEMANGLE_COMPONENT_JAVA_CLASS
:
3879 case DEMANGLE_COMPONENT_GUARD
:
3880 case DEMANGLE_COMPONENT_TLS_INIT
:
3881 case DEMANGLE_COMPONENT_TLS_WRAPPER
:
3882 case DEMANGLE_COMPONENT_REFTEMP
:
3883 case DEMANGLE_COMPONENT_HIDDEN_ALIAS
:
3884 case DEMANGLE_COMPONENT_RESTRICT
:
3885 case DEMANGLE_COMPONENT_VOLATILE
:
3886 case DEMANGLE_COMPONENT_CONST
:
3887 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
3888 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
3889 case DEMANGLE_COMPONENT_CONST_THIS
:
3890 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
3891 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
3892 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
3893 case DEMANGLE_COMPONENT_POINTER
:
3894 case DEMANGLE_COMPONENT_COMPLEX
:
3895 case DEMANGLE_COMPONENT_IMAGINARY
:
3896 case DEMANGLE_COMPONENT_VENDOR_TYPE
:
3897 case DEMANGLE_COMPONENT_FUNCTION_TYPE
:
3898 case DEMANGLE_COMPONENT_ARRAY_TYPE
:
3899 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
3900 case DEMANGLE_COMPONENT_VECTOR_TYPE
:
3901 case DEMANGLE_COMPONENT_ARGLIST
:
3902 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
:
3903 case DEMANGLE_COMPONENT_INITIALIZER_LIST
:
3904 case DEMANGLE_COMPONENT_CAST
:
3905 case DEMANGLE_COMPONENT_NULLARY
:
3906 case DEMANGLE_COMPONENT_UNARY
:
3907 case DEMANGLE_COMPONENT_BINARY
:
3908 case DEMANGLE_COMPONENT_BINARY_ARGS
:
3909 case DEMANGLE_COMPONENT_TRINARY
:
3910 case DEMANGLE_COMPONENT_TRINARY_ARG1
:
3911 case DEMANGLE_COMPONENT_TRINARY_ARG2
:
3912 case DEMANGLE_COMPONENT_LITERAL
:
3913 case DEMANGLE_COMPONENT_LITERAL_NEG
:
3914 case DEMANGLE_COMPONENT_JAVA_RESOURCE
:
3915 case DEMANGLE_COMPONENT_COMPOUND_NAME
:
3916 case DEMANGLE_COMPONENT_DECLTYPE
:
3917 case DEMANGLE_COMPONENT_TRANSACTION_CLONE
:
3918 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
:
3919 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
3920 case DEMANGLE_COMPONENT_TAGGED_NAME
:
3921 case DEMANGLE_COMPONENT_CLONE
:
3923 d_count_templates_scopes (num_templates
, num_scopes
,
3925 d_count_templates_scopes (num_templates
, num_scopes
,
3929 case DEMANGLE_COMPONENT_CTOR
:
3930 d_count_templates_scopes (num_templates
, num_scopes
,
3934 case DEMANGLE_COMPONENT_DTOR
:
3935 d_count_templates_scopes (num_templates
, num_scopes
,
3939 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
3940 d_count_templates_scopes (num_templates
, num_scopes
,
3941 dc
->u
.s_extended_operator
.name
);
3944 case DEMANGLE_COMPONENT_FIXED_TYPE
:
3945 d_count_templates_scopes (num_templates
, num_scopes
,
3946 dc
->u
.s_fixed
.length
);
3949 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
:
3950 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS
:
3951 d_count_templates_scopes (num_templates
, num_scopes
,
3955 case DEMANGLE_COMPONENT_LAMBDA
:
3956 case DEMANGLE_COMPONENT_DEFAULT_ARG
:
3957 d_count_templates_scopes (num_templates
, num_scopes
,
3958 dc
->u
.s_unary_num
.sub
);
3963 /* Initialize a print information structure. */
3966 d_print_init (struct d_print_info
*dpi
, demangle_callbackref callback
,
3967 void *opaque
, const struct demangle_component
*dc
)
3970 dpi
->last_char
= '\0';
3971 dpi
->templates
= NULL
;
3972 dpi
->modifiers
= NULL
;
3973 dpi
->pack_index
= 0;
3974 dpi
->flush_count
= 0;
3976 dpi
->callback
= callback
;
3977 dpi
->opaque
= opaque
;
3979 dpi
->demangle_failure
= 0;
3981 dpi
->component_stack
= NULL
;
3983 dpi
->saved_scopes
= NULL
;
3984 dpi
->next_saved_scope
= 0;
3985 dpi
->num_saved_scopes
= 0;
3987 dpi
->copy_templates
= NULL
;
3988 dpi
->next_copy_template
= 0;
3989 dpi
->num_copy_templates
= 0;
3991 d_count_templates_scopes (&dpi
->num_copy_templates
,
3992 &dpi
->num_saved_scopes
, dc
);
3993 dpi
->num_copy_templates
*= dpi
->num_saved_scopes
;
3995 dpi
->current_template
= NULL
;
3998 /* Indicate that an error occurred during printing, and test for error. */
4001 d_print_error (struct d_print_info
*dpi
)
4003 dpi
->demangle_failure
= 1;
4007 d_print_saw_error (struct d_print_info
*dpi
)
4009 return dpi
->demangle_failure
!= 0;
4012 /* Flush buffered characters to the callback. */
4015 d_print_flush (struct d_print_info
*dpi
)
4017 dpi
->buf
[dpi
->len
] = '\0';
4018 dpi
->callback (dpi
->buf
, dpi
->len
, dpi
->opaque
);
4023 /* Append characters and buffers for printing. */
4026 d_append_char (struct d_print_info
*dpi
, char c
)
4028 if (dpi
->len
== sizeof (dpi
->buf
) - 1)
4029 d_print_flush (dpi
);
4031 dpi
->buf
[dpi
->len
++] = c
;
4036 d_append_buffer (struct d_print_info
*dpi
, const char *s
, size_t l
)
4040 for (i
= 0; i
< l
; i
++)
4041 d_append_char (dpi
, s
[i
]);
4045 d_append_string (struct d_print_info
*dpi
, const char *s
)
4047 d_append_buffer (dpi
, s
, strlen (s
));
4051 d_append_num (struct d_print_info
*dpi
, long l
)
4054 sprintf (buf
,"%ld", l
);
4055 d_append_string (dpi
, buf
);
4059 d_last_char (struct d_print_info
*dpi
)
4061 return dpi
->last_char
;
4064 /* Turn components into a human readable string. OPTIONS is the
4065 options bits passed to the demangler. DC is the tree to print.
4066 CALLBACK is a function to call to flush demangled string segments
4067 as they fill the intermediate buffer, and OPAQUE is a generalized
4068 callback argument. On success, this returns 1. On failure,
4069 it returns 0, indicating a bad parse. It does not use heap
4070 memory to build an output string, so cannot encounter memory
4071 allocation failure. */
4073 CP_STATIC_IF_GLIBCPP_V3
4075 cplus_demangle_print_callback (int options
,
4076 const struct demangle_component
*dc
,
4077 demangle_callbackref callback
, void *opaque
)
4079 struct d_print_info dpi
;
4081 d_print_init (&dpi
, callback
, opaque
, dc
);
4084 #ifdef CP_DYNAMIC_ARRAYS
4085 __extension__
struct d_saved_scope scopes
[dpi
.num_saved_scopes
];
4086 __extension__
struct d_print_template temps
[dpi
.num_copy_templates
];
4088 dpi
.saved_scopes
= scopes
;
4089 dpi
.copy_templates
= temps
;
4091 dpi
.saved_scopes
= alloca (dpi
.num_saved_scopes
4092 * sizeof (*dpi
.saved_scopes
));
4093 dpi
.copy_templates
= alloca (dpi
.num_copy_templates
4094 * sizeof (*dpi
.copy_templates
));
4097 d_print_comp (&dpi
, options
, dc
);
4100 d_print_flush (&dpi
);
4102 return ! d_print_saw_error (&dpi
);
4105 /* Turn components into a human readable string. OPTIONS is the
4106 options bits passed to the demangler. DC is the tree to print.
4107 ESTIMATE is a guess at the length of the result. This returns a
4108 string allocated by malloc, or NULL on error. On success, this
4109 sets *PALC to the size of the allocated buffer. On failure, this
4110 sets *PALC to 0 for a bad parse, or to 1 for a memory allocation
4113 CP_STATIC_IF_GLIBCPP_V3
4115 cplus_demangle_print (int options
, const struct demangle_component
*dc
,
4116 int estimate
, size_t *palc
)
4118 struct d_growable_string dgs
;
4120 d_growable_string_init (&dgs
, estimate
);
4122 if (! cplus_demangle_print_callback (options
, dc
,
4123 d_growable_string_callback_adapter
,
4131 *palc
= dgs
.allocation_failure
? 1 : dgs
.alc
;
4135 /* Returns the I'th element of the template arglist ARGS, or NULL on
4138 static struct demangle_component
*
4139 d_index_template_argument (struct demangle_component
*args
, int i
)
4141 struct demangle_component
*a
;
4147 if (a
->type
!= DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
)
4153 if (i
!= 0 || a
== NULL
)
4159 /* Returns the template argument from the current context indicated by DC,
4160 which is a DEMANGLE_COMPONENT_TEMPLATE_PARAM, or NULL. */
4162 static struct demangle_component
*
4163 d_lookup_template_argument (struct d_print_info
*dpi
,
4164 const struct demangle_component
*dc
)
4166 if (dpi
->templates
== NULL
)
4168 d_print_error (dpi
);
4172 return d_index_template_argument
4173 (d_right (dpi
->templates
->template_decl
),
4174 dc
->u
.s_number
.number
);
4177 /* Returns a template argument pack used in DC (any will do), or NULL. */
4179 static struct demangle_component
*
4180 d_find_pack (struct d_print_info
*dpi
,
4181 const struct demangle_component
*dc
)
4183 struct demangle_component
*a
;
4189 case DEMANGLE_COMPONENT_TEMPLATE_PARAM
:
4190 a
= d_lookup_template_argument (dpi
, dc
);
4191 if (a
&& a
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
)
4195 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
4198 case DEMANGLE_COMPONENT_LAMBDA
:
4199 case DEMANGLE_COMPONENT_NAME
:
4200 case DEMANGLE_COMPONENT_TAGGED_NAME
:
4201 case DEMANGLE_COMPONENT_OPERATOR
:
4202 case DEMANGLE_COMPONENT_BUILTIN_TYPE
:
4203 case DEMANGLE_COMPONENT_SUB_STD
:
4204 case DEMANGLE_COMPONENT_CHARACTER
:
4205 case DEMANGLE_COMPONENT_FUNCTION_PARAM
:
4206 case DEMANGLE_COMPONENT_UNNAMED_TYPE
:
4209 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
4210 return d_find_pack (dpi
, dc
->u
.s_extended_operator
.name
);
4211 case DEMANGLE_COMPONENT_CTOR
:
4212 return d_find_pack (dpi
, dc
->u
.s_ctor
.name
);
4213 case DEMANGLE_COMPONENT_DTOR
:
4214 return d_find_pack (dpi
, dc
->u
.s_dtor
.name
);
4217 a
= d_find_pack (dpi
, d_left (dc
));
4220 return d_find_pack (dpi
, d_right (dc
));
4224 /* Returns the length of the template argument pack DC. */
4227 d_pack_length (const struct demangle_component
*dc
)
4230 while (dc
&& dc
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
4231 && d_left (dc
) != NULL
)
4239 /* DC is a component of a mangled expression. Print it, wrapped in parens
4243 d_print_subexpr (struct d_print_info
*dpi
, int options
,
4244 const struct demangle_component
*dc
)
4247 if (dc
->type
== DEMANGLE_COMPONENT_NAME
4248 || dc
->type
== DEMANGLE_COMPONENT_QUAL_NAME
4249 || dc
->type
== DEMANGLE_COMPONENT_INITIALIZER_LIST
4250 || dc
->type
== DEMANGLE_COMPONENT_FUNCTION_PARAM
)
4253 d_append_char (dpi
, '(');
4254 d_print_comp (dpi
, options
, dc
);
4256 d_append_char (dpi
, ')');
4259 /* Save the current scope. */
4262 d_save_scope (struct d_print_info
*dpi
,
4263 const struct demangle_component
*container
)
4265 struct d_saved_scope
*scope
;
4266 struct d_print_template
*src
, **link
;
4268 if (dpi
->next_saved_scope
>= dpi
->num_saved_scopes
)
4270 d_print_error (dpi
);
4273 scope
= &dpi
->saved_scopes
[dpi
->next_saved_scope
];
4274 dpi
->next_saved_scope
++;
4276 scope
->container
= container
;
4277 link
= &scope
->templates
;
4279 for (src
= dpi
->templates
; src
!= NULL
; src
= src
->next
)
4281 struct d_print_template
*dst
;
4283 if (dpi
->next_copy_template
>= dpi
->num_copy_templates
)
4285 d_print_error (dpi
);
4288 dst
= &dpi
->copy_templates
[dpi
->next_copy_template
];
4289 dpi
->next_copy_template
++;
4291 dst
->template_decl
= src
->template_decl
;
4299 /* Attempt to locate a previously saved scope. Returns NULL if no
4300 corresponding saved scope was found. */
4302 static struct d_saved_scope
*
4303 d_get_saved_scope (struct d_print_info
*dpi
,
4304 const struct demangle_component
*container
)
4308 for (i
= 0; i
< dpi
->next_saved_scope
; i
++)
4309 if (dpi
->saved_scopes
[i
].container
== container
)
4310 return &dpi
->saved_scopes
[i
];
4315 /* Subroutine to handle components. */
4318 d_print_comp_inner (struct d_print_info
*dpi
, int options
,
4319 const struct demangle_component
*dc
)
4321 /* Magic variable to let reference smashing skip over the next modifier
4322 without needing to modify *dc. */
4323 const struct demangle_component
*mod_inner
= NULL
;
4325 /* Variable used to store the current templates while a previously
4326 captured scope is used. */
4327 struct d_print_template
*saved_templates
;
4329 /* Nonzero if templates have been stored in the above variable. */
4330 int need_template_restore
= 0;
4334 d_print_error (dpi
);
4337 if (d_print_saw_error (dpi
))
4342 case DEMANGLE_COMPONENT_NAME
:
4343 if ((options
& DMGL_JAVA
) == 0)
4344 d_append_buffer (dpi
, dc
->u
.s_name
.s
, dc
->u
.s_name
.len
);
4346 d_print_java_identifier (dpi
, dc
->u
.s_name
.s
, dc
->u
.s_name
.len
);
4349 case DEMANGLE_COMPONENT_TAGGED_NAME
:
4350 d_print_comp (dpi
, options
, d_left (dc
));
4351 d_append_string (dpi
, "[abi:");
4352 d_print_comp (dpi
, options
, d_right (dc
));
4353 d_append_char (dpi
, ']');
4356 case DEMANGLE_COMPONENT_QUAL_NAME
:
4357 case DEMANGLE_COMPONENT_LOCAL_NAME
:
4358 d_print_comp (dpi
, options
, d_left (dc
));
4359 if ((options
& DMGL_JAVA
) == 0)
4360 d_append_string (dpi
, "::");
4362 d_append_char (dpi
, '.');
4364 struct demangle_component
*local_name
= d_right (dc
);
4365 if (local_name
->type
== DEMANGLE_COMPONENT_DEFAULT_ARG
)
4367 d_append_string (dpi
, "{default arg#");
4368 d_append_num (dpi
, local_name
->u
.s_unary_num
.num
+ 1);
4369 d_append_string (dpi
, "}::");
4370 local_name
= local_name
->u
.s_unary_num
.sub
;
4372 d_print_comp (dpi
, options
, local_name
);
4376 case DEMANGLE_COMPONENT_TYPED_NAME
:
4378 struct d_print_mod
*hold_modifiers
;
4379 struct demangle_component
*typed_name
;
4380 struct d_print_mod adpm
[4];
4382 struct d_print_template dpt
;
4384 /* Pass the name down to the type so that it can be printed in
4385 the right place for the type. We also have to pass down
4386 any CV-qualifiers, which apply to the this parameter. */
4387 hold_modifiers
= dpi
->modifiers
;
4390 typed_name
= d_left (dc
);
4391 while (typed_name
!= NULL
)
4393 if (i
>= sizeof adpm
/ sizeof adpm
[0])
4395 d_print_error (dpi
);
4399 adpm
[i
].next
= dpi
->modifiers
;
4400 dpi
->modifiers
= &adpm
[i
];
4401 adpm
[i
].mod
= typed_name
;
4402 adpm
[i
].printed
= 0;
4403 adpm
[i
].templates
= dpi
->templates
;
4406 if (typed_name
->type
!= DEMANGLE_COMPONENT_RESTRICT_THIS
4407 && typed_name
->type
!= DEMANGLE_COMPONENT_VOLATILE_THIS
4408 && typed_name
->type
!= DEMANGLE_COMPONENT_CONST_THIS
4409 && typed_name
->type
!= DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
4410 && typed_name
->type
!= DEMANGLE_COMPONENT_REFERENCE_THIS
)
4413 typed_name
= d_left (typed_name
);
4416 if (typed_name
== NULL
)
4418 d_print_error (dpi
);
4422 /* If typed_name is a template, then it applies to the
4423 function type as well. */
4424 if (typed_name
->type
== DEMANGLE_COMPONENT_TEMPLATE
)
4426 dpt
.next
= dpi
->templates
;
4427 dpi
->templates
= &dpt
;
4428 dpt
.template_decl
= typed_name
;
4431 /* If typed_name is a DEMANGLE_COMPONENT_LOCAL_NAME, then
4432 there may be CV-qualifiers on its right argument which
4433 really apply here; this happens when parsing a class which
4434 is local to a function. */
4435 if (typed_name
->type
== DEMANGLE_COMPONENT_LOCAL_NAME
)
4437 struct demangle_component
*local_name
;
4439 local_name
= d_right (typed_name
);
4440 if (local_name
->type
== DEMANGLE_COMPONENT_DEFAULT_ARG
)
4441 local_name
= local_name
->u
.s_unary_num
.sub
;
4442 while (local_name
->type
== DEMANGLE_COMPONENT_RESTRICT_THIS
4443 || local_name
->type
== DEMANGLE_COMPONENT_VOLATILE_THIS
4444 || local_name
->type
== DEMANGLE_COMPONENT_CONST_THIS
4445 || local_name
->type
== DEMANGLE_COMPONENT_REFERENCE_THIS
4446 || (local_name
->type
4447 == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
))
4449 if (i
>= sizeof adpm
/ sizeof adpm
[0])
4451 d_print_error (dpi
);
4455 adpm
[i
] = adpm
[i
- 1];
4456 adpm
[i
].next
= &adpm
[i
- 1];
4457 dpi
->modifiers
= &adpm
[i
];
4459 adpm
[i
- 1].mod
= local_name
;
4460 adpm
[i
- 1].printed
= 0;
4461 adpm
[i
- 1].templates
= dpi
->templates
;
4464 local_name
= d_left (local_name
);
4468 d_print_comp (dpi
, options
, d_right (dc
));
4470 if (typed_name
->type
== DEMANGLE_COMPONENT_TEMPLATE
)
4471 dpi
->templates
= dpt
.next
;
4473 /* If the modifiers didn't get printed by the type, print them
4478 if (! adpm
[i
].printed
)
4480 d_append_char (dpi
, ' ');
4481 d_print_mod (dpi
, options
, adpm
[i
].mod
);
4485 dpi
->modifiers
= hold_modifiers
;
4490 case DEMANGLE_COMPONENT_TEMPLATE
:
4492 struct d_print_mod
*hold_dpm
;
4493 struct demangle_component
*dcl
;
4494 const struct demangle_component
*hold_current
;
4496 /* This template may need to be referenced by a cast operator
4497 contained in its subtree. */
4498 hold_current
= dpi
->current_template
;
4499 dpi
->current_template
= dc
;
4501 /* Don't push modifiers into a template definition. Doing so
4502 could give the wrong definition for a template argument.
4503 Instead, treat the template essentially as a name. */
4505 hold_dpm
= dpi
->modifiers
;
4506 dpi
->modifiers
= NULL
;
4510 if ((options
& DMGL_JAVA
) != 0
4511 && dcl
->type
== DEMANGLE_COMPONENT_NAME
4512 && dcl
->u
.s_name
.len
== 6
4513 && strncmp (dcl
->u
.s_name
.s
, "JArray", 6) == 0)
4515 /* Special-case Java arrays, so that JArray<TYPE> appears
4516 instead as TYPE[]. */
4518 d_print_comp (dpi
, options
, d_right (dc
));
4519 d_append_string (dpi
, "[]");
4523 d_print_comp (dpi
, options
, dcl
);
4524 if (d_last_char (dpi
) == '<')
4525 d_append_char (dpi
, ' ');
4526 d_append_char (dpi
, '<');
4527 d_print_comp (dpi
, options
, d_right (dc
));
4528 /* Avoid generating two consecutive '>' characters, to avoid
4529 the C++ syntactic ambiguity. */
4530 if (d_last_char (dpi
) == '>')
4531 d_append_char (dpi
, ' ');
4532 d_append_char (dpi
, '>');
4535 dpi
->modifiers
= hold_dpm
;
4536 dpi
->current_template
= hold_current
;
4541 case DEMANGLE_COMPONENT_TEMPLATE_PARAM
:
4543 struct d_print_template
*hold_dpt
;
4544 struct demangle_component
*a
= d_lookup_template_argument (dpi
, dc
);
4546 if (a
&& a
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
)
4547 a
= d_index_template_argument (a
, dpi
->pack_index
);
4551 d_print_error (dpi
);
4555 /* While processing this parameter, we need to pop the list of
4556 templates. This is because the template parameter may
4557 itself be a reference to a parameter of an outer
4560 hold_dpt
= dpi
->templates
;
4561 dpi
->templates
= hold_dpt
->next
;
4563 d_print_comp (dpi
, options
, a
);
4565 dpi
->templates
= hold_dpt
;
4570 case DEMANGLE_COMPONENT_CTOR
:
4571 d_print_comp (dpi
, options
, dc
->u
.s_ctor
.name
);
4574 case DEMANGLE_COMPONENT_DTOR
:
4575 d_append_char (dpi
, '~');
4576 d_print_comp (dpi
, options
, dc
->u
.s_dtor
.name
);
4579 case DEMANGLE_COMPONENT_VTABLE
:
4580 d_append_string (dpi
, "vtable for ");
4581 d_print_comp (dpi
, options
, d_left (dc
));
4584 case DEMANGLE_COMPONENT_VTT
:
4585 d_append_string (dpi
, "VTT for ");
4586 d_print_comp (dpi
, options
, d_left (dc
));
4589 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
:
4590 d_append_string (dpi
, "construction vtable for ");
4591 d_print_comp (dpi
, options
, d_left (dc
));
4592 d_append_string (dpi
, "-in-");
4593 d_print_comp (dpi
, options
, d_right (dc
));
4596 case DEMANGLE_COMPONENT_TYPEINFO
:
4597 d_append_string (dpi
, "typeinfo for ");
4598 d_print_comp (dpi
, options
, d_left (dc
));
4601 case DEMANGLE_COMPONENT_TYPEINFO_NAME
:
4602 d_append_string (dpi
, "typeinfo name for ");
4603 d_print_comp (dpi
, options
, d_left (dc
));
4606 case DEMANGLE_COMPONENT_TYPEINFO_FN
:
4607 d_append_string (dpi
, "typeinfo fn for ");
4608 d_print_comp (dpi
, options
, d_left (dc
));
4611 case DEMANGLE_COMPONENT_THUNK
:
4612 d_append_string (dpi
, "non-virtual thunk to ");
4613 d_print_comp (dpi
, options
, d_left (dc
));
4616 case DEMANGLE_COMPONENT_VIRTUAL_THUNK
:
4617 d_append_string (dpi
, "virtual thunk to ");
4618 d_print_comp (dpi
, options
, d_left (dc
));
4621 case DEMANGLE_COMPONENT_COVARIANT_THUNK
:
4622 d_append_string (dpi
, "covariant return thunk to ");
4623 d_print_comp (dpi
, options
, d_left (dc
));
4626 case DEMANGLE_COMPONENT_JAVA_CLASS
:
4627 d_append_string (dpi
, "java Class for ");
4628 d_print_comp (dpi
, options
, d_left (dc
));
4631 case DEMANGLE_COMPONENT_GUARD
:
4632 d_append_string (dpi
, "guard variable for ");
4633 d_print_comp (dpi
, options
, d_left (dc
));
4636 case DEMANGLE_COMPONENT_TLS_INIT
:
4637 d_append_string (dpi
, "TLS init function for ");
4638 d_print_comp (dpi
, options
, d_left (dc
));
4641 case DEMANGLE_COMPONENT_TLS_WRAPPER
:
4642 d_append_string (dpi
, "TLS wrapper function for ");
4643 d_print_comp (dpi
, options
, d_left (dc
));
4646 case DEMANGLE_COMPONENT_REFTEMP
:
4647 d_append_string (dpi
, "reference temporary #");
4648 d_print_comp (dpi
, options
, d_right (dc
));
4649 d_append_string (dpi
, " for ");
4650 d_print_comp (dpi
, options
, d_left (dc
));
4653 case DEMANGLE_COMPONENT_HIDDEN_ALIAS
:
4654 d_append_string (dpi
, "hidden alias for ");
4655 d_print_comp (dpi
, options
, d_left (dc
));
4658 case DEMANGLE_COMPONENT_TRANSACTION_CLONE
:
4659 d_append_string (dpi
, "transaction clone for ");
4660 d_print_comp (dpi
, options
, d_left (dc
));
4663 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
:
4664 d_append_string (dpi
, "non-transaction clone for ");
4665 d_print_comp (dpi
, options
, d_left (dc
));
4668 case DEMANGLE_COMPONENT_SUB_STD
:
4669 d_append_buffer (dpi
, dc
->u
.s_string
.string
, dc
->u
.s_string
.len
);
4672 case DEMANGLE_COMPONENT_RESTRICT
:
4673 case DEMANGLE_COMPONENT_VOLATILE
:
4674 case DEMANGLE_COMPONENT_CONST
:
4676 struct d_print_mod
*pdpm
;
4678 /* When printing arrays, it's possible to have cases where the
4679 same CV-qualifier gets pushed on the stack multiple times.
4680 We only need to print it once. */
4682 for (pdpm
= dpi
->modifiers
; pdpm
!= NULL
; pdpm
= pdpm
->next
)
4684 if (! pdpm
->printed
)
4686 if (pdpm
->mod
->type
!= DEMANGLE_COMPONENT_RESTRICT
4687 && pdpm
->mod
->type
!= DEMANGLE_COMPONENT_VOLATILE
4688 && pdpm
->mod
->type
!= DEMANGLE_COMPONENT_CONST
)
4690 if (pdpm
->mod
->type
== dc
->type
)
4692 d_print_comp (dpi
, options
, d_left (dc
));
4700 case DEMANGLE_COMPONENT_REFERENCE
:
4701 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
4703 /* Handle reference smashing: & + && = &. */
4704 const struct demangle_component
*sub
= d_left (dc
);
4705 if (sub
->type
== DEMANGLE_COMPONENT_TEMPLATE_PARAM
)
4707 struct d_saved_scope
*scope
= d_get_saved_scope (dpi
, sub
);
4708 struct demangle_component
*a
;
4712 /* This is the first time SUB has been traversed.
4713 We need to capture the current templates so
4714 they can be restored if SUB is reentered as a
4716 d_save_scope (dpi
, sub
);
4717 if (d_print_saw_error (dpi
))
4722 const struct d_component_stack
*dcse
;
4723 int found_self_or_parent
= 0;
4725 /* This traversal is reentering SUB as a substition.
4726 If we are not beneath SUB or DC in the tree then we
4727 need to restore SUB's template stack temporarily. */
4728 for (dcse
= dpi
->component_stack
; dcse
!= NULL
;
4729 dcse
= dcse
->parent
)
4733 && dcse
!= dpi
->component_stack
))
4735 found_self_or_parent
= 1;
4740 if (!found_self_or_parent
)
4742 saved_templates
= dpi
->templates
;
4743 dpi
->templates
= scope
->templates
;
4744 need_template_restore
= 1;
4748 a
= d_lookup_template_argument (dpi
, sub
);
4749 if (a
&& a
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
)
4750 a
= d_index_template_argument (a
, dpi
->pack_index
);
4754 if (need_template_restore
)
4755 dpi
->templates
= saved_templates
;
4757 d_print_error (dpi
);
4764 if (sub
->type
== DEMANGLE_COMPONENT_REFERENCE
4765 || sub
->type
== dc
->type
)
4767 else if (sub
->type
== DEMANGLE_COMPONENT_RVALUE_REFERENCE
)
4768 mod_inner
= d_left (sub
);
4772 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
4773 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
4774 case DEMANGLE_COMPONENT_CONST_THIS
:
4775 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
4776 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
4777 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
4778 case DEMANGLE_COMPONENT_POINTER
:
4779 case DEMANGLE_COMPONENT_COMPLEX
:
4780 case DEMANGLE_COMPONENT_IMAGINARY
:
4783 /* We keep a list of modifiers on the stack. */
4784 struct d_print_mod dpm
;
4786 dpm
.next
= dpi
->modifiers
;
4787 dpi
->modifiers
= &dpm
;
4790 dpm
.templates
= dpi
->templates
;
4793 mod_inner
= d_left (dc
);
4795 d_print_comp (dpi
, options
, mod_inner
);
4797 /* If the modifier didn't get printed by the type, print it
4800 d_print_mod (dpi
, options
, dc
);
4802 dpi
->modifiers
= dpm
.next
;
4804 if (need_template_restore
)
4805 dpi
->templates
= saved_templates
;
4810 case DEMANGLE_COMPONENT_BUILTIN_TYPE
:
4811 if ((options
& DMGL_JAVA
) == 0)
4812 d_append_buffer (dpi
, dc
->u
.s_builtin
.type
->name
,
4813 dc
->u
.s_builtin
.type
->len
);
4815 d_append_buffer (dpi
, dc
->u
.s_builtin
.type
->java_name
,
4816 dc
->u
.s_builtin
.type
->java_len
);
4819 case DEMANGLE_COMPONENT_VENDOR_TYPE
:
4820 d_print_comp (dpi
, options
, d_left (dc
));
4823 case DEMANGLE_COMPONENT_FUNCTION_TYPE
:
4825 if ((options
& DMGL_RET_POSTFIX
) != 0)
4826 d_print_function_type (dpi
,
4827 options
& ~(DMGL_RET_POSTFIX
| DMGL_RET_DROP
),
4828 dc
, dpi
->modifiers
);
4830 /* Print return type if present */
4831 if (d_left (dc
) != NULL
&& (options
& DMGL_RET_POSTFIX
) != 0)
4832 d_print_comp (dpi
, options
& ~(DMGL_RET_POSTFIX
| DMGL_RET_DROP
),
4834 else if (d_left (dc
) != NULL
&& (options
& DMGL_RET_DROP
) == 0)
4836 struct d_print_mod dpm
;
4838 /* We must pass this type down as a modifier in order to
4839 print it in the right location. */
4840 dpm
.next
= dpi
->modifiers
;
4841 dpi
->modifiers
= &dpm
;
4844 dpm
.templates
= dpi
->templates
;
4846 d_print_comp (dpi
, options
& ~(DMGL_RET_POSTFIX
| DMGL_RET_DROP
),
4849 dpi
->modifiers
= dpm
.next
;
4854 /* In standard prefix notation, there is a space between the
4855 return type and the function signature. */
4856 if ((options
& DMGL_RET_POSTFIX
) == 0)
4857 d_append_char (dpi
, ' ');
4860 if ((options
& DMGL_RET_POSTFIX
) == 0)
4861 d_print_function_type (dpi
,
4862 options
& ~(DMGL_RET_POSTFIX
| DMGL_RET_DROP
),
4863 dc
, dpi
->modifiers
);
4868 case DEMANGLE_COMPONENT_ARRAY_TYPE
:
4870 struct d_print_mod
*hold_modifiers
;
4871 struct d_print_mod adpm
[4];
4873 struct d_print_mod
*pdpm
;
4875 /* We must pass this type down as a modifier in order to print
4876 multi-dimensional arrays correctly. If the array itself is
4877 CV-qualified, we act as though the element type were
4878 CV-qualified. We do this by copying the modifiers down
4879 rather than fiddling pointers, so that we don't wind up
4880 with a d_print_mod higher on the stack pointing into our
4881 stack frame after we return. */
4883 hold_modifiers
= dpi
->modifiers
;
4885 adpm
[0].next
= hold_modifiers
;
4886 dpi
->modifiers
= &adpm
[0];
4888 adpm
[0].printed
= 0;
4889 adpm
[0].templates
= dpi
->templates
;
4892 pdpm
= hold_modifiers
;
4894 && (pdpm
->mod
->type
== DEMANGLE_COMPONENT_RESTRICT
4895 || pdpm
->mod
->type
== DEMANGLE_COMPONENT_VOLATILE
4896 || pdpm
->mod
->type
== DEMANGLE_COMPONENT_CONST
))
4898 if (! pdpm
->printed
)
4900 if (i
>= sizeof adpm
/ sizeof adpm
[0])
4902 d_print_error (dpi
);
4907 adpm
[i
].next
= dpi
->modifiers
;
4908 dpi
->modifiers
= &adpm
[i
];
4916 d_print_comp (dpi
, options
, d_right (dc
));
4918 dpi
->modifiers
= hold_modifiers
;
4920 if (adpm
[0].printed
)
4926 d_print_mod (dpi
, options
, adpm
[i
].mod
);
4929 d_print_array_type (dpi
, options
, dc
, dpi
->modifiers
);
4934 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
4935 case DEMANGLE_COMPONENT_VECTOR_TYPE
:
4937 struct d_print_mod dpm
;
4939 dpm
.next
= dpi
->modifiers
;
4940 dpi
->modifiers
= &dpm
;
4943 dpm
.templates
= dpi
->templates
;
4945 d_print_comp (dpi
, options
, d_right (dc
));
4947 /* If the modifier didn't get printed by the type, print it
4950 d_print_mod (dpi
, options
, dc
);
4952 dpi
->modifiers
= dpm
.next
;
4957 case DEMANGLE_COMPONENT_FIXED_TYPE
:
4958 if (dc
->u
.s_fixed
.sat
)
4959 d_append_string (dpi
, "_Sat ");
4960 /* Don't print "int _Accum". */
4961 if (dc
->u
.s_fixed
.length
->u
.s_builtin
.type
4962 != &cplus_demangle_builtin_types
['i'-'a'])
4964 d_print_comp (dpi
, options
, dc
->u
.s_fixed
.length
);
4965 d_append_char (dpi
, ' ');
4967 if (dc
->u
.s_fixed
.accum
)
4968 d_append_string (dpi
, "_Accum");
4970 d_append_string (dpi
, "_Fract");
4973 case DEMANGLE_COMPONENT_ARGLIST
:
4974 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
:
4975 if (d_left (dc
) != NULL
)
4976 d_print_comp (dpi
, options
, d_left (dc
));
4977 if (d_right (dc
) != NULL
)
4980 unsigned long int flush_count
;
4981 /* Make sure ", " isn't flushed by d_append_string, otherwise
4982 dpi->len -= 2 wouldn't work. */
4983 if (dpi
->len
>= sizeof (dpi
->buf
) - 2)
4984 d_print_flush (dpi
);
4985 d_append_string (dpi
, ", ");
4987 flush_count
= dpi
->flush_count
;
4988 d_print_comp (dpi
, options
, d_right (dc
));
4989 /* If that didn't print anything (which can happen with empty
4990 template argument packs), remove the comma and space. */
4991 if (dpi
->flush_count
== flush_count
&& dpi
->len
== len
)
4996 case DEMANGLE_COMPONENT_INITIALIZER_LIST
:
4998 struct demangle_component
*type
= d_left (dc
);
4999 struct demangle_component
*list
= d_right (dc
);
5002 d_print_comp (dpi
, options
, type
);
5003 d_append_char (dpi
, '{');
5004 d_print_comp (dpi
, options
, list
);
5005 d_append_char (dpi
, '}');
5009 case DEMANGLE_COMPONENT_OPERATOR
:
5011 const struct demangle_operator_info
*op
= dc
->u
.s_operator
.op
;
5014 d_append_string (dpi
, "operator");
5015 /* Add a space before new/delete. */
5016 if (IS_LOWER (op
->name
[0]))
5017 d_append_char (dpi
, ' ');
5018 /* Omit a trailing space. */
5019 if (op
->name
[len
-1] == ' ')
5021 d_append_buffer (dpi
, op
->name
, len
);
5025 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
5026 d_append_string (dpi
, "operator ");
5027 d_print_comp (dpi
, options
, dc
->u
.s_extended_operator
.name
);
5030 case DEMANGLE_COMPONENT_CAST
:
5031 d_append_string (dpi
, "operator ");
5032 d_print_cast (dpi
, options
, dc
);
5035 case DEMANGLE_COMPONENT_NULLARY
:
5036 d_print_expr_op (dpi
, options
, d_left (dc
));
5039 case DEMANGLE_COMPONENT_UNARY
:
5041 struct demangle_component
*op
= d_left (dc
);
5042 struct demangle_component
*operand
= d_right (dc
);
5043 const char *code
= NULL
;
5045 if (op
->type
== DEMANGLE_COMPONENT_OPERATOR
)
5047 code
= op
->u
.s_operator
.op
->code
;
5048 if (!strcmp (code
, "ad"))
5050 /* Don't print the argument list for the address of a
5052 if (operand
->type
== DEMANGLE_COMPONENT_TYPED_NAME
5053 && d_left (operand
)->type
== DEMANGLE_COMPONENT_QUAL_NAME
5054 && d_right (operand
)->type
== DEMANGLE_COMPONENT_FUNCTION_TYPE
)
5055 operand
= d_left (operand
);
5057 if (operand
->type
== DEMANGLE_COMPONENT_BINARY_ARGS
)
5059 /* This indicates a suffix operator. */
5060 operand
= d_left (operand
);
5061 d_print_subexpr (dpi
, options
, operand
);
5062 d_print_expr_op (dpi
, options
, op
);
5067 if (op
->type
!= DEMANGLE_COMPONENT_CAST
)
5068 d_print_expr_op (dpi
, options
, op
);
5071 d_append_char (dpi
, '(');
5072 d_print_cast (dpi
, options
, op
);
5073 d_append_char (dpi
, ')');
5075 if (code
&& !strcmp (code
, "gs"))
5076 /* Avoid parens after '::'. */
5077 d_print_comp (dpi
, options
, operand
);
5078 else if (code
&& !strcmp (code
, "st"))
5079 /* Always print parens for sizeof (type). */
5081 d_append_char (dpi
, '(');
5082 d_print_comp (dpi
, options
, operand
);
5083 d_append_char (dpi
, ')');
5086 d_print_subexpr (dpi
, options
, operand
);
5090 case DEMANGLE_COMPONENT_BINARY
:
5091 if (d_right (dc
)->type
!= DEMANGLE_COMPONENT_BINARY_ARGS
)
5093 d_print_error (dpi
);
5097 if (op_is_new_cast (d_left (dc
)))
5099 d_print_expr_op (dpi
, options
, d_left (dc
));
5100 d_append_char (dpi
, '<');
5101 d_print_comp (dpi
, options
, d_left (d_right (dc
)));
5102 d_append_string (dpi
, ">(");
5103 d_print_comp (dpi
, options
, d_right (d_right (dc
)));
5104 d_append_char (dpi
, ')');
5108 /* We wrap an expression which uses the greater-than operator in
5109 an extra layer of parens so that it does not get confused
5110 with the '>' which ends the template parameters. */
5111 if (d_left (dc
)->type
== DEMANGLE_COMPONENT_OPERATOR
5112 && d_left (dc
)->u
.s_operator
.op
->len
== 1
5113 && d_left (dc
)->u
.s_operator
.op
->name
[0] == '>')
5114 d_append_char (dpi
, '(');
5116 if (strcmp (d_left (dc
)->u
.s_operator
.op
->code
, "cl") == 0
5117 && d_left (d_right (dc
))->type
== DEMANGLE_COMPONENT_TYPED_NAME
)
5119 /* Function call used in an expression should not have printed types
5120 of the function arguments. Values of the function arguments still
5121 get printed below. */
5123 const struct demangle_component
*func
= d_left (d_right (dc
));
5125 if (d_right (func
)->type
!= DEMANGLE_COMPONENT_FUNCTION_TYPE
)
5126 d_print_error (dpi
);
5127 d_print_subexpr (dpi
, options
, d_left (func
));
5130 d_print_subexpr (dpi
, options
, d_left (d_right (dc
)));
5131 if (strcmp (d_left (dc
)->u
.s_operator
.op
->code
, "ix") == 0)
5133 d_append_char (dpi
, '[');
5134 d_print_comp (dpi
, options
, d_right (d_right (dc
)));
5135 d_append_char (dpi
, ']');
5139 if (strcmp (d_left (dc
)->u
.s_operator
.op
->code
, "cl") != 0)
5140 d_print_expr_op (dpi
, options
, d_left (dc
));
5141 d_print_subexpr (dpi
, options
, d_right (d_right (dc
)));
5144 if (d_left (dc
)->type
== DEMANGLE_COMPONENT_OPERATOR
5145 && d_left (dc
)->u
.s_operator
.op
->len
== 1
5146 && d_left (dc
)->u
.s_operator
.op
->name
[0] == '>')
5147 d_append_char (dpi
, ')');
5151 case DEMANGLE_COMPONENT_BINARY_ARGS
:
5152 /* We should only see this as part of DEMANGLE_COMPONENT_BINARY. */
5153 d_print_error (dpi
);
5156 case DEMANGLE_COMPONENT_TRINARY
:
5157 if (d_right (dc
)->type
!= DEMANGLE_COMPONENT_TRINARY_ARG1
5158 || d_right (d_right (dc
))->type
!= DEMANGLE_COMPONENT_TRINARY_ARG2
)
5160 d_print_error (dpi
);
5164 struct demangle_component
*op
= d_left (dc
);
5165 struct demangle_component
*first
= d_left (d_right (dc
));
5166 struct demangle_component
*second
= d_left (d_right (d_right (dc
)));
5167 struct demangle_component
*third
= d_right (d_right (d_right (dc
)));
5169 if (!strcmp (op
->u
.s_operator
.op
->code
, "qu"))
5171 d_print_subexpr (dpi
, options
, first
);
5172 d_print_expr_op (dpi
, options
, op
);
5173 d_print_subexpr (dpi
, options
, second
);
5174 d_append_string (dpi
, " : ");
5175 d_print_subexpr (dpi
, options
, third
);
5179 d_append_string (dpi
, "new ");
5180 if (d_left (first
) != NULL
)
5182 d_print_subexpr (dpi
, options
, first
);
5183 d_append_char (dpi
, ' ');
5185 d_print_comp (dpi
, options
, second
);
5187 d_print_subexpr (dpi
, options
, third
);
5192 case DEMANGLE_COMPONENT_TRINARY_ARG1
:
5193 case DEMANGLE_COMPONENT_TRINARY_ARG2
:
5194 /* We should only see these are part of DEMANGLE_COMPONENT_TRINARY. */
5195 d_print_error (dpi
);
5198 case DEMANGLE_COMPONENT_LITERAL
:
5199 case DEMANGLE_COMPONENT_LITERAL_NEG
:
5201 enum d_builtin_type_print tp
;
5203 /* For some builtin types, produce simpler output. */
5204 tp
= D_PRINT_DEFAULT
;
5205 if (d_left (dc
)->type
== DEMANGLE_COMPONENT_BUILTIN_TYPE
)
5207 tp
= d_left (dc
)->u
.s_builtin
.type
->print
;
5211 case D_PRINT_UNSIGNED
:
5213 case D_PRINT_UNSIGNED_LONG
:
5214 case D_PRINT_LONG_LONG
:
5215 case D_PRINT_UNSIGNED_LONG_LONG
:
5216 if (d_right (dc
)->type
== DEMANGLE_COMPONENT_NAME
)
5218 if (dc
->type
== DEMANGLE_COMPONENT_LITERAL_NEG
)
5219 d_append_char (dpi
, '-');
5220 d_print_comp (dpi
, options
, d_right (dc
));
5225 case D_PRINT_UNSIGNED
:
5226 d_append_char (dpi
, 'u');
5229 d_append_char (dpi
, 'l');
5231 case D_PRINT_UNSIGNED_LONG
:
5232 d_append_string (dpi
, "ul");
5234 case D_PRINT_LONG_LONG
:
5235 d_append_string (dpi
, "ll");
5237 case D_PRINT_UNSIGNED_LONG_LONG
:
5238 d_append_string (dpi
, "ull");
5246 if (d_right (dc
)->type
== DEMANGLE_COMPONENT_NAME
5247 && d_right (dc
)->u
.s_name
.len
== 1
5248 && dc
->type
== DEMANGLE_COMPONENT_LITERAL
)
5250 switch (d_right (dc
)->u
.s_name
.s
[0])
5253 d_append_string (dpi
, "false");
5256 d_append_string (dpi
, "true");
5269 d_append_char (dpi
, '(');
5270 d_print_comp (dpi
, options
, d_left (dc
));
5271 d_append_char (dpi
, ')');
5272 if (dc
->type
== DEMANGLE_COMPONENT_LITERAL_NEG
)
5273 d_append_char (dpi
, '-');
5274 if (tp
== D_PRINT_FLOAT
)
5275 d_append_char (dpi
, '[');
5276 d_print_comp (dpi
, options
, d_right (dc
));
5277 if (tp
== D_PRINT_FLOAT
)
5278 d_append_char (dpi
, ']');
5282 case DEMANGLE_COMPONENT_NUMBER
:
5283 d_append_num (dpi
, dc
->u
.s_number
.number
);
5286 case DEMANGLE_COMPONENT_JAVA_RESOURCE
:
5287 d_append_string (dpi
, "java resource ");
5288 d_print_comp (dpi
, options
, d_left (dc
));
5291 case DEMANGLE_COMPONENT_COMPOUND_NAME
:
5292 d_print_comp (dpi
, options
, d_left (dc
));
5293 d_print_comp (dpi
, options
, d_right (dc
));
5296 case DEMANGLE_COMPONENT_CHARACTER
:
5297 d_append_char (dpi
, dc
->u
.s_character
.character
);
5300 case DEMANGLE_COMPONENT_DECLTYPE
:
5301 d_append_string (dpi
, "decltype (");
5302 d_print_comp (dpi
, options
, d_left (dc
));
5303 d_append_char (dpi
, ')');
5306 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
5310 struct demangle_component
*a
= d_find_pack (dpi
, d_left (dc
));
5313 /* d_find_pack won't find anything if the only packs involved
5314 in this expansion are function parameter packs; in that
5315 case, just print the pattern and "...". */
5316 d_print_subexpr (dpi
, options
, d_left (dc
));
5317 d_append_string (dpi
, "...");
5321 len
= d_pack_length (a
);
5323 for (i
= 0; i
< len
; ++i
)
5325 dpi
->pack_index
= i
;
5326 d_print_comp (dpi
, options
, dc
);
5328 d_append_string (dpi
, ", ");
5333 case DEMANGLE_COMPONENT_FUNCTION_PARAM
:
5335 long num
= dc
->u
.s_number
.number
;
5337 d_append_string (dpi
, "this");
5340 d_append_string (dpi
, "{parm#");
5341 d_append_num (dpi
, num
);
5342 d_append_char (dpi
, '}');
5347 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
:
5348 d_append_string (dpi
, "global constructors keyed to ");
5349 d_print_comp (dpi
, options
, dc
->u
.s_binary
.left
);
5352 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS
:
5353 d_append_string (dpi
, "global destructors keyed to ");
5354 d_print_comp (dpi
, options
, dc
->u
.s_binary
.left
);
5357 case DEMANGLE_COMPONENT_LAMBDA
:
5358 d_append_string (dpi
, "{lambda(");
5359 d_print_comp (dpi
, options
, dc
->u
.s_unary_num
.sub
);
5360 d_append_string (dpi
, ")#");
5361 d_append_num (dpi
, dc
->u
.s_unary_num
.num
+ 1);
5362 d_append_char (dpi
, '}');
5365 case DEMANGLE_COMPONENT_UNNAMED_TYPE
:
5366 d_append_string (dpi
, "{unnamed type#");
5367 d_append_num (dpi
, dc
->u
.s_number
.number
+ 1);
5368 d_append_char (dpi
, '}');
5371 case DEMANGLE_COMPONENT_CLONE
:
5372 d_print_comp (dpi
, options
, d_left (dc
));
5373 d_append_string (dpi
, " [clone ");
5374 d_print_comp (dpi
, options
, d_right (dc
));
5375 d_append_char (dpi
, ']');
5379 d_print_error (dpi
);
5385 d_print_comp (struct d_print_info
*dpi
, int options
,
5386 const struct demangle_component
*dc
)
5388 struct d_component_stack self
;
5391 self
.parent
= dpi
->component_stack
;
5392 dpi
->component_stack
= &self
;
5394 d_print_comp_inner (dpi
, options
, dc
);
5396 dpi
->component_stack
= self
.parent
;
5399 /* Print a Java dentifier. For Java we try to handle encoded extended
5400 Unicode characters. The C++ ABI doesn't mention Unicode encoding,
5401 so we don't it for C++. Characters are encoded as
5405 d_print_java_identifier (struct d_print_info
*dpi
, const char *name
, int len
)
5411 for (p
= name
; p
< end
; ++p
)
5422 for (q
= p
+ 3; q
< end
; ++q
)
5428 else if (*q
>= 'A' && *q
<= 'F')
5429 dig
= *q
- 'A' + 10;
5430 else if (*q
>= 'a' && *q
<= 'f')
5431 dig
= *q
- 'a' + 10;
5437 /* If the Unicode character is larger than 256, we don't try
5438 to deal with it here. FIXME. */
5439 if (q
< end
&& *q
== '_' && c
< 256)
5441 d_append_char (dpi
, c
);
5447 d_append_char (dpi
, *p
);
5451 /* Print a list of modifiers. SUFFIX is 1 if we are printing
5452 qualifiers on this after printing a function. */
5455 d_print_mod_list (struct d_print_info
*dpi
, int options
,
5456 struct d_print_mod
*mods
, int suffix
)
5458 struct d_print_template
*hold_dpt
;
5460 if (mods
== NULL
|| d_print_saw_error (dpi
))
5465 && (mods
->mod
->type
== DEMANGLE_COMPONENT_RESTRICT_THIS
5466 || mods
->mod
->type
== DEMANGLE_COMPONENT_VOLATILE_THIS
5467 || mods
->mod
->type
== DEMANGLE_COMPONENT_CONST_THIS
5468 || mods
->mod
->type
== DEMANGLE_COMPONENT_REFERENCE_THIS
5470 == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
))))
5472 d_print_mod_list (dpi
, options
, mods
->next
, suffix
);
5478 hold_dpt
= dpi
->templates
;
5479 dpi
->templates
= mods
->templates
;
5481 if (mods
->mod
->type
== DEMANGLE_COMPONENT_FUNCTION_TYPE
)
5483 d_print_function_type (dpi
, options
, mods
->mod
, mods
->next
);
5484 dpi
->templates
= hold_dpt
;
5487 else if (mods
->mod
->type
== DEMANGLE_COMPONENT_ARRAY_TYPE
)
5489 d_print_array_type (dpi
, options
, mods
->mod
, mods
->next
);
5490 dpi
->templates
= hold_dpt
;
5493 else if (mods
->mod
->type
== DEMANGLE_COMPONENT_LOCAL_NAME
)
5495 struct d_print_mod
*hold_modifiers
;
5496 struct demangle_component
*dc
;
5498 /* When this is on the modifier stack, we have pulled any
5499 qualifiers off the right argument already. Otherwise, we
5500 print it as usual, but don't let the left argument see any
5503 hold_modifiers
= dpi
->modifiers
;
5504 dpi
->modifiers
= NULL
;
5505 d_print_comp (dpi
, options
, d_left (mods
->mod
));
5506 dpi
->modifiers
= hold_modifiers
;
5508 if ((options
& DMGL_JAVA
) == 0)
5509 d_append_string (dpi
, "::");
5511 d_append_char (dpi
, '.');
5513 dc
= d_right (mods
->mod
);
5515 if (dc
->type
== DEMANGLE_COMPONENT_DEFAULT_ARG
)
5517 d_append_string (dpi
, "{default arg#");
5518 d_append_num (dpi
, dc
->u
.s_unary_num
.num
+ 1);
5519 d_append_string (dpi
, "}::");
5520 dc
= dc
->u
.s_unary_num
.sub
;
5523 while (dc
->type
== DEMANGLE_COMPONENT_RESTRICT_THIS
5524 || dc
->type
== DEMANGLE_COMPONENT_VOLATILE_THIS
5525 || dc
->type
== DEMANGLE_COMPONENT_CONST_THIS
5526 || dc
->type
== DEMANGLE_COMPONENT_REFERENCE_THIS
5527 || dc
->type
== DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
)
5530 d_print_comp (dpi
, options
, dc
);
5532 dpi
->templates
= hold_dpt
;
5536 d_print_mod (dpi
, options
, mods
->mod
);
5538 dpi
->templates
= hold_dpt
;
5540 d_print_mod_list (dpi
, options
, mods
->next
, suffix
);
5543 /* Print a modifier. */
5546 d_print_mod (struct d_print_info
*dpi
, int options
,
5547 const struct demangle_component
*mod
)
5551 case DEMANGLE_COMPONENT_RESTRICT
:
5552 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
5553 d_append_string (dpi
, " restrict");
5555 case DEMANGLE_COMPONENT_VOLATILE
:
5556 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
5557 d_append_string (dpi
, " volatile");
5559 case DEMANGLE_COMPONENT_CONST
:
5560 case DEMANGLE_COMPONENT_CONST_THIS
:
5561 d_append_string (dpi
, " const");
5563 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
5564 d_append_char (dpi
, ' ');
5565 d_print_comp (dpi
, options
, d_right (mod
));
5567 case DEMANGLE_COMPONENT_POINTER
:
5568 /* There is no pointer symbol in Java. */
5569 if ((options
& DMGL_JAVA
) == 0)
5570 d_append_char (dpi
, '*');
5572 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
5573 /* For the ref-qualifier, put a space before the &. */
5574 d_append_char (dpi
, ' ');
5575 case DEMANGLE_COMPONENT_REFERENCE
:
5576 d_append_char (dpi
, '&');
5578 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
5579 d_append_char (dpi
, ' ');
5580 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
5581 d_append_string (dpi
, "&&");
5583 case DEMANGLE_COMPONENT_COMPLEX
:
5584 d_append_string (dpi
, "complex ");
5586 case DEMANGLE_COMPONENT_IMAGINARY
:
5587 d_append_string (dpi
, "imaginary ");
5589 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
5590 if (d_last_char (dpi
) != '(')
5591 d_append_char (dpi
, ' ');
5592 d_print_comp (dpi
, options
, d_left (mod
));
5593 d_append_string (dpi
, "::*");
5595 case DEMANGLE_COMPONENT_TYPED_NAME
:
5596 d_print_comp (dpi
, options
, d_left (mod
));
5598 case DEMANGLE_COMPONENT_VECTOR_TYPE
:
5599 d_append_string (dpi
, " __vector(");
5600 d_print_comp (dpi
, options
, d_left (mod
));
5601 d_append_char (dpi
, ')');
5605 /* Otherwise, we have something that won't go back on the
5606 modifier stack, so we can just print it. */
5607 d_print_comp (dpi
, options
, mod
);
5612 /* Print a function type, except for the return type. */
5615 d_print_function_type (struct d_print_info
*dpi
, int options
,
5616 const struct demangle_component
*dc
,
5617 struct d_print_mod
*mods
)
5621 struct d_print_mod
*p
;
5622 struct d_print_mod
*hold_modifiers
;
5626 for (p
= mods
; p
!= NULL
; p
= p
->next
)
5631 switch (p
->mod
->type
)
5633 case DEMANGLE_COMPONENT_POINTER
:
5634 case DEMANGLE_COMPONENT_REFERENCE
:
5635 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
5638 case DEMANGLE_COMPONENT_RESTRICT
:
5639 case DEMANGLE_COMPONENT_VOLATILE
:
5640 case DEMANGLE_COMPONENT_CONST
:
5641 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
5642 case DEMANGLE_COMPONENT_COMPLEX
:
5643 case DEMANGLE_COMPONENT_IMAGINARY
:
5644 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
5648 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
5649 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
5650 case DEMANGLE_COMPONENT_CONST_THIS
:
5651 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
5652 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
5665 if (d_last_char (dpi
) != '('
5666 && d_last_char (dpi
) != '*')
5669 if (need_space
&& d_last_char (dpi
) != ' ')
5670 d_append_char (dpi
, ' ');
5671 d_append_char (dpi
, '(');
5674 hold_modifiers
= dpi
->modifiers
;
5675 dpi
->modifiers
= NULL
;
5677 d_print_mod_list (dpi
, options
, mods
, 0);
5680 d_append_char (dpi
, ')');
5682 d_append_char (dpi
, '(');
5684 if (d_right (dc
) != NULL
)
5685 d_print_comp (dpi
, options
, d_right (dc
));
5687 d_append_char (dpi
, ')');
5689 d_print_mod_list (dpi
, options
, mods
, 1);
5691 dpi
->modifiers
= hold_modifiers
;
5694 /* Print an array type, except for the element type. */
5697 d_print_array_type (struct d_print_info
*dpi
, int options
,
5698 const struct demangle_component
*dc
,
5699 struct d_print_mod
*mods
)
5707 struct d_print_mod
*p
;
5710 for (p
= mods
; p
!= NULL
; p
= p
->next
)
5714 if (p
->mod
->type
== DEMANGLE_COMPONENT_ARRAY_TYPE
)
5729 d_append_string (dpi
, " (");
5731 d_print_mod_list (dpi
, options
, mods
, 0);
5734 d_append_char (dpi
, ')');
5738 d_append_char (dpi
, ' ');
5740 d_append_char (dpi
, '[');
5742 if (d_left (dc
) != NULL
)
5743 d_print_comp (dpi
, options
, d_left (dc
));
5745 d_append_char (dpi
, ']');
5748 /* Print an operator in an expression. */
5751 d_print_expr_op (struct d_print_info
*dpi
, int options
,
5752 const struct demangle_component
*dc
)
5754 if (dc
->type
== DEMANGLE_COMPONENT_OPERATOR
)
5755 d_append_buffer (dpi
, dc
->u
.s_operator
.op
->name
,
5756 dc
->u
.s_operator
.op
->len
);
5758 d_print_comp (dpi
, options
, dc
);
5764 d_print_cast (struct d_print_info
*dpi
, int options
,
5765 const struct demangle_component
*dc
)
5767 struct d_print_template dpt
;
5769 /* For a cast operator, we need the template parameters from
5770 the enclosing template in scope for processing the type. */
5771 if (dpi
->current_template
!= NULL
)
5773 dpt
.next
= dpi
->templates
;
5774 dpi
->templates
= &dpt
;
5775 dpt
.template_decl
= dpi
->current_template
;
5778 if (d_left (dc
)->type
!= DEMANGLE_COMPONENT_TEMPLATE
)
5780 d_print_comp (dpi
, options
, d_left (dc
));
5781 if (dpi
->current_template
!= NULL
)
5782 dpi
->templates
= dpt
.next
;
5786 d_print_comp (dpi
, options
, d_left (d_left (dc
)));
5788 /* For a templated cast operator, we need to remove the template
5789 parameters from scope after printing the operator name,
5790 so we need to handle the template printing here. */
5791 if (dpi
->current_template
!= NULL
)
5792 dpi
->templates
= dpt
.next
;
5794 if (d_last_char (dpi
) == '<')
5795 d_append_char (dpi
, ' ');
5796 d_append_char (dpi
, '<');
5797 d_print_comp (dpi
, options
, d_right (d_left (dc
)));
5798 /* Avoid generating two consecutive '>' characters, to avoid
5799 the C++ syntactic ambiguity. */
5800 if (d_last_char (dpi
) == '>')
5801 d_append_char (dpi
, ' ');
5802 d_append_char (dpi
, '>');
5806 /* Initialize the information structure we use to pass around
5809 CP_STATIC_IF_GLIBCPP_V3
5811 cplus_demangle_init_info (const char *mangled
, int options
, size_t len
,
5815 di
->send
= mangled
+ len
;
5816 di
->options
= options
;
5820 /* We can not need more components than twice the number of chars in
5821 the mangled string. Most components correspond directly to
5822 chars, but the ARGLIST types are exceptions. */
5823 di
->num_comps
= 2 * len
;
5826 /* Similarly, we can not need more substitutions than there are
5827 chars in the mangled string. */
5832 di
->last_name
= NULL
;
5835 di
->is_expression
= 0;
5836 di
->is_conversion
= 0;
5839 /* Internal implementation for the demangler. If MANGLED is a g++ v3 ABI
5840 mangled name, return strings in repeated callback giving the demangled
5841 name. OPTIONS is the usual libiberty demangler options. On success,
5842 this returns 1. On failure, returns 0. */
5845 d_demangle_callback (const char *mangled
, int options
,
5846 demangle_callbackref callback
, void *opaque
)
5857 struct demangle_component
*dc
;
5860 if (mangled
[0] == '_' && mangled
[1] == 'Z')
5862 else if (strncmp (mangled
, "_GLOBAL_", 8) == 0
5863 && (mangled
[8] == '.' || mangled
[8] == '_' || mangled
[8] == '$')
5864 && (mangled
[9] == 'D' || mangled
[9] == 'I')
5865 && mangled
[10] == '_')
5866 type
= mangled
[9] == 'I' ? DCT_GLOBAL_CTORS
: DCT_GLOBAL_DTORS
;
5869 if ((options
& DMGL_TYPES
) == 0)
5874 cplus_demangle_init_info (mangled
, options
, strlen (mangled
), &di
);
5877 #ifdef CP_DYNAMIC_ARRAYS
5878 __extension__
struct demangle_component comps
[di
.num_comps
];
5879 __extension__
struct demangle_component
*subs
[di
.num_subs
];
5884 di
.comps
= alloca (di
.num_comps
* sizeof (*di
.comps
));
5885 di
.subs
= alloca (di
.num_subs
* sizeof (*di
.subs
));
5891 dc
= cplus_demangle_type (&di
);
5894 dc
= cplus_demangle_mangled_name (&di
, 1);
5896 case DCT_GLOBAL_CTORS
:
5897 case DCT_GLOBAL_DTORS
:
5898 d_advance (&di
, 11);
5899 dc
= d_make_comp (&di
,
5900 (type
== DCT_GLOBAL_CTORS
5901 ? DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
5902 : DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS
),
5903 d_make_demangle_mangled_name (&di
, d_str (&di
)),
5905 d_advance (&di
, strlen (d_str (&di
)));
5908 abort (); /* We have listed all the cases. */
5911 /* If DMGL_PARAMS is set, then if we didn't consume the entire
5912 mangled string, then we didn't successfully demangle it. If
5913 DMGL_PARAMS is not set, we didn't look at the trailing
5915 if (((options
& DMGL_PARAMS
) != 0) && d_peek_char (&di
) != '\0')
5918 #ifdef CP_DEMANGLE_DEBUG
5922 status
= (dc
!= NULL
)
5923 ? cplus_demangle_print_callback (options
, dc
, callback
, opaque
)
5930 /* Entry point for the demangler. If MANGLED is a g++ v3 ABI mangled
5931 name, return a buffer allocated with malloc holding the demangled
5932 name. OPTIONS is the usual libiberty demangler options. On
5933 success, this sets *PALC to the allocated size of the returned
5934 buffer. On failure, this sets *PALC to 0 for a bad name, or 1 for
5935 a memory allocation failure, and returns NULL. */
5938 d_demangle (const char *mangled
, int options
, size_t *palc
)
5940 struct d_growable_string dgs
;
5943 d_growable_string_init (&dgs
, 0);
5945 status
= d_demangle_callback (mangled
, options
,
5946 d_growable_string_callback_adapter
, &dgs
);
5954 *palc
= dgs
.allocation_failure
? 1 : dgs
.alc
;
5958 #if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3)
5960 extern char *__cxa_demangle (const char *, char *, size_t *, int *);
5962 /* ia64 ABI-mandated entry point in the C++ runtime library for
5963 performing demangling. MANGLED_NAME is a NUL-terminated character
5964 string containing the name to be demangled.
5966 OUTPUT_BUFFER is a region of memory, allocated with malloc, of
5967 *LENGTH bytes, into which the demangled name is stored. If
5968 OUTPUT_BUFFER is not long enough, it is expanded using realloc.
5969 OUTPUT_BUFFER may instead be NULL; in that case, the demangled name
5970 is placed in a region of memory allocated with malloc.
5972 If LENGTH is non-NULL, the length of the buffer containing the
5973 demangled name, is placed in *LENGTH.
5975 The return value is a pointer to the start of the NUL-terminated
5976 demangled name, or NULL if the demangling fails. The caller is
5977 responsible for deallocating this memory using free.
5979 *STATUS is set to one of the following values:
5980 0: The demangling operation succeeded.
5981 -1: A memory allocation failure occurred.
5982 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
5983 -3: One of the arguments is invalid.
5985 The demangling is performed using the C++ ABI mangling rules, with
5989 __cxa_demangle (const char *mangled_name
, char *output_buffer
,
5990 size_t *length
, int *status
)
5995 if (mangled_name
== NULL
)
6002 if (output_buffer
!= NULL
&& length
== NULL
)
6009 demangled
= d_demangle (mangled_name
, DMGL_PARAMS
| DMGL_TYPES
, &alc
);
6011 if (demangled
== NULL
)
6023 if (output_buffer
== NULL
)
6030 if (strlen (demangled
) < *length
)
6032 strcpy (output_buffer
, demangled
);
6034 demangled
= output_buffer
;
6038 free (output_buffer
);
6049 extern int __gcclibcxx_demangle_callback (const char *,
6051 (const char *, size_t, void *),
6054 /* Alternative, allocationless entry point in the C++ runtime library
6055 for performing demangling. MANGLED_NAME is a NUL-terminated character
6056 string containing the name to be demangled.
6058 CALLBACK is a callback function, called with demangled string
6059 segments as demangling progresses; it is called at least once,
6060 but may be called more than once. OPAQUE is a generalized pointer
6061 used as a callback argument.
6063 The return code is one of the following values, equivalent to
6064 the STATUS values of __cxa_demangle() (excluding -1, since this
6065 function performs no memory allocations):
6066 0: The demangling operation succeeded.
6067 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
6068 -3: One of the arguments is invalid.
6070 The demangling is performed using the C++ ABI mangling rules, with
6074 __gcclibcxx_demangle_callback (const char *mangled_name
,
6075 void (*callback
) (const char *, size_t, void *),
6080 if (mangled_name
== NULL
|| callback
== NULL
)
6083 status
= d_demangle_callback (mangled_name
, DMGL_PARAMS
| DMGL_TYPES
,
6091 #else /* ! (IN_LIBGCC2 || IN_GLIBCPP_V3) */
6093 /* Entry point for libiberty demangler. If MANGLED is a g++ v3 ABI
6094 mangled name, return a buffer allocated with malloc holding the
6095 demangled name. Otherwise, return NULL. */
6098 cplus_demangle_v3 (const char *mangled
, int options
)
6102 return d_demangle (mangled
, options
, &alc
);
6106 cplus_demangle_v3_callback (const char *mangled
, int options
,
6107 demangle_callbackref callback
, void *opaque
)
6109 return d_demangle_callback (mangled
, options
, callback
, opaque
);
6112 /* Demangle a Java symbol. Java uses a subset of the V3 ABI C++ mangling
6113 conventions, but the output formatting is a little different.
6114 This instructs the C++ demangler not to emit pointer characters ("*"), to
6115 use Java's namespace separator symbol ("." instead of "::"), and to output
6116 JArray<TYPE> as TYPE[]. */
6119 java_demangle_v3 (const char *mangled
)
6123 return d_demangle (mangled
, DMGL_JAVA
| DMGL_PARAMS
| DMGL_RET_POSTFIX
, &alc
);
6127 java_demangle_v3_callback (const char *mangled
,
6128 demangle_callbackref callback
, void *opaque
)
6130 return d_demangle_callback (mangled
,
6131 DMGL_JAVA
| DMGL_PARAMS
| DMGL_RET_POSTFIX
,
6135 #endif /* IN_LIBGCC2 || IN_GLIBCPP_V3 */
6137 #ifndef IN_GLIBCPP_V3
6139 /* Demangle a string in order to find out whether it is a constructor
6140 or destructor. Return non-zero on success. Set *CTOR_KIND and
6141 *DTOR_KIND appropriately. */
6144 is_ctor_or_dtor (const char *mangled
,
6145 enum gnu_v3_ctor_kinds
*ctor_kind
,
6146 enum gnu_v3_dtor_kinds
*dtor_kind
)
6149 struct demangle_component
*dc
;
6152 *ctor_kind
= (enum gnu_v3_ctor_kinds
) 0;
6153 *dtor_kind
= (enum gnu_v3_dtor_kinds
) 0;
6155 cplus_demangle_init_info (mangled
, DMGL_GNU_V3
, strlen (mangled
), &di
);
6158 #ifdef CP_DYNAMIC_ARRAYS
6159 __extension__
struct demangle_component comps
[di
.num_comps
];
6160 __extension__
struct demangle_component
*subs
[di
.num_subs
];
6165 di
.comps
= alloca (di
.num_comps
* sizeof (*di
.comps
));
6166 di
.subs
= alloca (di
.num_subs
* sizeof (*di
.subs
));
6169 dc
= cplus_demangle_mangled_name (&di
, 1);
6171 /* Note that because we did not pass DMGL_PARAMS, we don't expect
6172 to demangle the entire string. */
6179 /* These cannot appear on a constructor or destructor. */
6180 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
6181 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
6182 case DEMANGLE_COMPONENT_CONST_THIS
:
6183 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
6184 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
6188 case DEMANGLE_COMPONENT_TYPED_NAME
:
6189 case DEMANGLE_COMPONENT_TEMPLATE
:
6192 case DEMANGLE_COMPONENT_QUAL_NAME
:
6193 case DEMANGLE_COMPONENT_LOCAL_NAME
:
6196 case DEMANGLE_COMPONENT_CTOR
:
6197 *ctor_kind
= dc
->u
.s_ctor
.kind
;
6201 case DEMANGLE_COMPONENT_DTOR
:
6202 *dtor_kind
= dc
->u
.s_dtor
.kind
;
6213 /* Return whether NAME is the mangled form of a g++ V3 ABI constructor
6214 name. A non-zero return indicates the type of constructor. */
6216 enum gnu_v3_ctor_kinds
6217 is_gnu_v3_mangled_ctor (const char *name
)
6219 enum gnu_v3_ctor_kinds ctor_kind
;
6220 enum gnu_v3_dtor_kinds dtor_kind
;
6222 if (! is_ctor_or_dtor (name
, &ctor_kind
, &dtor_kind
))
6223 return (enum gnu_v3_ctor_kinds
) 0;
6228 /* Return whether NAME is the mangled form of a g++ V3 ABI destructor
6229 name. A non-zero return indicates the type of destructor. */
6231 enum gnu_v3_dtor_kinds
6232 is_gnu_v3_mangled_dtor (const char *name
)
6234 enum gnu_v3_ctor_kinds ctor_kind
;
6235 enum gnu_v3_dtor_kinds dtor_kind
;
6237 if (! is_ctor_or_dtor (name
, &ctor_kind
, &dtor_kind
))
6238 return (enum gnu_v3_dtor_kinds
) 0;
6242 #endif /* IN_GLIBCPP_V3 */
6244 #ifdef STANDALONE_DEMANGLER
6247 #include "dyn-string.h"
6249 static void print_usage (FILE* fp
, int exit_value
);
6251 #define IS_ALPHA(CHAR) \
6252 (((CHAR) >= 'a' && (CHAR) <= 'z') \
6253 || ((CHAR) >= 'A' && (CHAR) <= 'Z'))
6255 /* Non-zero if CHAR is a character than can occur in a mangled name. */
6256 #define is_mangled_char(CHAR) \
6257 (IS_ALPHA (CHAR) || IS_DIGIT (CHAR) \
6258 || (CHAR) == '_' || (CHAR) == '.' || (CHAR) == '$')
6260 /* The name of this program, as invoked. */
6261 const char* program_name
;
6263 /* Prints usage summary to FP and then exits with EXIT_VALUE. */
6266 print_usage (FILE* fp
, int exit_value
)
6268 fprintf (fp
, "Usage: %s [options] [names ...]\n", program_name
);
6269 fprintf (fp
, "Options:\n");
6270 fprintf (fp
, " -h,--help Display this message.\n");
6271 fprintf (fp
, " -p,--no-params Don't display function parameters\n");
6272 fprintf (fp
, " -v,--verbose Produce verbose demanglings.\n");
6273 fprintf (fp
, "If names are provided, they are demangled. Otherwise filters standard input.\n");
6278 /* Option specification for getopt_long. */
6279 static const struct option long_options
[] =
6281 { "help", no_argument
, NULL
, 'h' },
6282 { "no-params", no_argument
, NULL
, 'p' },
6283 { "verbose", no_argument
, NULL
, 'v' },
6284 { NULL
, no_argument
, NULL
, 0 },
6287 /* Main entry for a demangling filter executable. It will demangle
6288 its command line arguments, if any. If none are provided, it will
6289 filter stdin to stdout, replacing any recognized mangled C++ names
6290 with their demangled equivalents. */
6293 main (int argc
, char *argv
[])
6297 int options
= DMGL_PARAMS
| DMGL_ANSI
| DMGL_TYPES
;
6299 /* Use the program name of this program, as invoked. */
6300 program_name
= argv
[0];
6302 /* Parse options. */
6305 opt_char
= getopt_long (argc
, argv
, "hpv", long_options
, NULL
);
6308 case '?': /* Unrecognized option. */
6309 print_usage (stderr
, 1);
6313 print_usage (stdout
, 0);
6317 options
&= ~ DMGL_PARAMS
;
6321 options
|= DMGL_VERBOSE
;
6325 while (opt_char
!= -1);
6328 /* No command line arguments were provided. Filter stdin. */
6330 dyn_string_t mangled
= dyn_string_new (3);
6333 /* Read all of input. */
6334 while (!feof (stdin
))
6338 /* Pile characters into mangled until we hit one that can't
6339 occur in a mangled name. */
6341 while (!feof (stdin
) && is_mangled_char (c
))
6343 dyn_string_append_char (mangled
, c
);
6349 if (dyn_string_length (mangled
) > 0)
6351 #ifdef IN_GLIBCPP_V3
6352 s
= __cxa_demangle (dyn_string_buf (mangled
), NULL
, NULL
, NULL
);
6354 s
= cplus_demangle_v3 (dyn_string_buf (mangled
), options
);
6364 /* It might not have been a mangled name. Print the
6366 fputs (dyn_string_buf (mangled
), stdout
);
6369 dyn_string_clear (mangled
);
6372 /* If we haven't hit EOF yet, we've read one character that
6373 can't occur in a mangled name, so print it out. */
6378 dyn_string_delete (mangled
);
6381 /* Demangle command line arguments. */
6383 /* Loop over command line arguments. */
6384 for (i
= optind
; i
< argc
; ++i
)
6387 #ifdef IN_GLIBCPP_V3
6391 /* Attempt to demangle. */
6392 #ifdef IN_GLIBCPP_V3
6393 s
= __cxa_demangle (argv
[i
], NULL
, NULL
, &status
);
6395 s
= cplus_demangle_v3 (argv
[i
], options
);
6398 /* If it worked, print the demangled name. */
6406 #ifdef IN_GLIBCPP_V3
6407 fprintf (stderr
, "Failed: %s (status %d)\n", argv
[i
], status
);
6409 fprintf (stderr
, "Failed: %s\n", argv
[i
]);
6418 #endif /* STANDALONE_DEMANGLER */