Merge reload-branch up to revision 101000
[official-gcc.git] / libiberty / cp-demangle.c
blob61744390725ef1201ff3b58f5da166bb3976a2c7
1 /* Demangler for g++ V3 ABI.
2 Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
3 Written by Ian Lance Taylor <ian@wasabisystems.com>.
5 This file is part of the libiberty library, which is part of GCC.
7 This file is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 In addition to the permissions in the GNU General Public License, the
13 Free Software Foundation gives you unlimited permission to link the
14 compiled version of this file into combinations with other programs,
15 and to distribute those combinations without any restriction coming
16 from the use of this file. (The General Public License restrictions
17 do apply in other respects; for example, they cover modification of
18 the file, and distribution when not linked into a combined
19 executable.)
21 This program is distributed in the hope that it will be useful,
22 but WITHOUT ANY WARRANTY; without even the implied warranty of
23 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 GNU General Public License for more details.
26 You should have received a copy of the GNU General Public License
27 along with this program; if not, write to the Free Software
28 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
31 /* This code implements a demangler for the g++ V3 ABI. The ABI is
32 described on this web page:
33 http://www.codesourcery.com/cxx-abi/abi.html#mangling
35 This code was written while looking at the demangler written by
36 Alex Samuel <samuel@codesourcery.com>.
38 This code first pulls the mangled name apart into a list of
39 components, and then walks the list generating the demangled
40 name.
42 This file will normally define the following functions, q.v.:
43 char *cplus_demangle_v3(const char *mangled, int options)
44 char *java_demangle_v3(const char *mangled)
45 enum gnu_v3_ctor_kinds is_gnu_v3_mangled_ctor (const char *name)
46 enum gnu_v3_dtor_kinds is_gnu_v3_mangled_dtor (const char *name)
48 Also, the interface to the component list is public, and defined in
49 demangle.h. The interface consists of these types, which are
50 defined in demangle.h:
51 enum demangle_component_type
52 struct demangle_component
53 and these functions defined in this file:
54 cplus_demangle_fill_name
55 cplus_demangle_fill_extended_operator
56 cplus_demangle_fill_ctor
57 cplus_demangle_fill_dtor
58 cplus_demangle_print
59 and other functions defined in the file cp-demint.c.
61 This file also defines some other functions and variables which are
62 only to be used by the file cp-demint.c.
64 Preprocessor macros you can define while compiling this file:
66 IN_LIBGCC2
67 If defined, this file defines the following function, q.v.:
68 char *__cxa_demangle (const char *mangled, char *buf, size_t *len,
69 int *status)
70 instead of cplus_demangle_v3() and java_demangle_v3().
72 IN_GLIBCPP_V3
73 If defined, this file defines only __cxa_demangle(), and no other
74 publically visible functions or variables.
76 STANDALONE_DEMANGLER
77 If defined, this file defines a main() function which demangles
78 any arguments, or, if none, demangles stdin.
80 CP_DEMANGLE_DEBUG
81 If defined, turns on debugging mode, which prints information on
82 stdout about the mangled string. This is not generally useful.
85 #ifdef HAVE_CONFIG_H
86 #include "config.h"
87 #endif
89 #include <stdio.h>
91 #ifdef HAVE_STDLIB_H
92 #include <stdlib.h>
93 #endif
94 #ifdef HAVE_STRING_H
95 #include <string.h>
96 #endif
98 #include "ansidecl.h"
99 #include "libiberty.h"
100 #include "demangle.h"
101 #include "cp-demangle.h"
103 /* If IN_GLIBCPP_V3 is defined, some functions are made static. We
104 also rename them via #define to avoid compiler errors when the
105 static definition conflicts with the extern declaration in a header
106 file. */
107 #ifdef IN_GLIBCPP_V3
109 #define CP_STATIC_IF_GLIBCPP_V3 static
111 #define cplus_demangle_fill_name d_fill_name
112 static int d_fill_name (struct demangle_component *, const char *, int);
114 #define cplus_demangle_fill_extended_operator d_fill_extended_operator
115 static int
116 d_fill_extended_operator (struct demangle_component *, int,
117 struct demangle_component *);
119 #define cplus_demangle_fill_ctor d_fill_ctor
120 static int
121 d_fill_ctor (struct demangle_component *, enum gnu_v3_ctor_kinds,
122 struct demangle_component *);
124 #define cplus_demangle_fill_dtor d_fill_dtor
125 static int
126 d_fill_dtor (struct demangle_component *, enum gnu_v3_dtor_kinds,
127 struct demangle_component *);
129 #define cplus_demangle_mangled_name d_mangled_name
130 static struct demangle_component *d_mangled_name (struct d_info *, int);
132 #define cplus_demangle_type d_type
133 static struct demangle_component *d_type (struct d_info *);
135 #define cplus_demangle_print d_print
136 static char *d_print (int, const struct demangle_component *, int, size_t *);
138 #define cplus_demangle_init_info d_init_info
139 static void d_init_info (const char *, int, size_t, struct d_info *);
141 #else /* ! defined(IN_GLIBCPP_V3) */
142 #define CP_STATIC_IF_GLIBCPP_V3
143 #endif /* ! defined(IN_GLIBCPP_V3) */
145 /* See if the compiler supports dynamic arrays. */
147 #ifdef __GNUC__
148 #define CP_DYNAMIC_ARRAYS
149 #else
150 #ifdef __STDC__
151 #ifdef __STDC_VERSION__
152 #if __STDC_VERSION__ >= 199901L
153 #define CP_DYNAMIC_ARRAYS
154 #endif /* __STDC__VERSION >= 199901L */
155 #endif /* defined (__STDC_VERSION__) */
156 #endif /* defined (__STDC__) */
157 #endif /* ! defined (__GNUC__) */
159 /* We avoid pulling in the ctype tables, to prevent pulling in
160 additional unresolved symbols when this code is used in a library.
161 FIXME: Is this really a valid reason? This comes from the original
162 V3 demangler code.
164 As of this writing this file has the following undefined references
165 when compiled with -DIN_GLIBCPP_V3: malloc, realloc, free, memcpy,
166 strcpy, strcat, strlen. */
168 #define IS_DIGIT(c) ((c) >= '0' && (c) <= '9')
169 #define IS_UPPER(c) ((c) >= 'A' && (c) <= 'Z')
170 #define IS_LOWER(c) ((c) >= 'a' && (c) <= 'z')
172 /* The prefix prepended by GCC to an identifier represnting the
173 anonymous namespace. */
174 #define ANONYMOUS_NAMESPACE_PREFIX "_GLOBAL_"
175 #define ANONYMOUS_NAMESPACE_PREFIX_LEN \
176 (sizeof (ANONYMOUS_NAMESPACE_PREFIX) - 1)
178 /* Information we keep for the standard substitutions. */
180 struct d_standard_sub_info
182 /* The code for this substitution. */
183 char code;
184 /* The simple string it expands to. */
185 const char *simple_expansion;
186 /* The length of the simple expansion. */
187 int simple_len;
188 /* The results of a full, verbose, expansion. This is used when
189 qualifying a constructor/destructor, or when in verbose mode. */
190 const char *full_expansion;
191 /* The length of the full expansion. */
192 int full_len;
193 /* What to set the last_name field of d_info to; NULL if we should
194 not set it. This is only relevant when qualifying a
195 constructor/destructor. */
196 const char *set_last_name;
197 /* The length of set_last_name. */
198 int set_last_name_len;
201 /* Accessors for subtrees of struct demangle_component. */
203 #define d_left(dc) ((dc)->u.s_binary.left)
204 #define d_right(dc) ((dc)->u.s_binary.right)
206 /* A list of templates. This is used while printing. */
208 struct d_print_template
210 /* Next template on the list. */
211 struct d_print_template *next;
212 /* This template. */
213 const struct demangle_component *template_decl;
216 /* A list of type modifiers. This is used while printing. */
218 struct d_print_mod
220 /* Next modifier on the list. These are in the reverse of the order
221 in which they appeared in the mangled string. */
222 struct d_print_mod *next;
223 /* The modifier. */
224 const struct demangle_component *mod;
225 /* Whether this modifier was printed. */
226 int printed;
227 /* The list of templates which applies to this modifier. */
228 struct d_print_template *templates;
231 /* We use this structure to hold information during printing. */
233 struct d_print_info
235 /* The options passed to the demangler. */
236 int options;
237 /* Buffer holding the result. */
238 char *buf;
239 /* Current length of data in buffer. */
240 size_t len;
241 /* Allocated size of buffer. */
242 size_t alc;
243 /* The current list of templates, if any. */
244 struct d_print_template *templates;
245 /* The current list of modifiers (e.g., pointer, reference, etc.),
246 if any. */
247 struct d_print_mod *modifiers;
248 /* Set to 1 if we had a memory allocation failure. */
249 int allocation_failure;
252 #define d_print_saw_error(dpi) ((dpi)->buf == NULL)
254 #define d_append_char(dpi, c) \
255 do \
257 if ((dpi)->buf != NULL && (dpi)->len < (dpi)->alc) \
258 (dpi)->buf[(dpi)->len++] = (c); \
259 else \
260 d_print_append_char ((dpi), (c)); \
262 while (0)
264 #define d_append_buffer(dpi, s, l) \
265 do \
267 if ((dpi)->buf != NULL && (dpi)->len + (l) <= (dpi)->alc) \
269 memcpy ((dpi)->buf + (dpi)->len, (s), (l)); \
270 (dpi)->len += l; \
272 else \
273 d_print_append_buffer ((dpi), (s), (l)); \
275 while (0)
277 #define d_append_string_constant(dpi, s) \
278 d_append_buffer (dpi, (s), sizeof (s) - 1)
280 #define d_last_char(dpi) \
281 ((dpi)->buf == NULL || (dpi)->len == 0 ? '\0' : (dpi)->buf[(dpi)->len - 1])
283 #ifdef CP_DEMANGLE_DEBUG
284 static void d_dump (struct demangle_component *, int);
285 #endif
287 static struct demangle_component *
288 d_make_empty (struct d_info *);
290 static struct demangle_component *
291 d_make_comp (struct d_info *, enum demangle_component_type,
292 struct demangle_component *,
293 struct demangle_component *);
295 static struct demangle_component *
296 d_make_name (struct d_info *, const char *, int);
298 static struct demangle_component *
299 d_make_builtin_type (struct d_info *,
300 const struct demangle_builtin_type_info *);
302 static struct demangle_component *
303 d_make_operator (struct d_info *,
304 const struct demangle_operator_info *);
306 static struct demangle_component *
307 d_make_extended_operator (struct d_info *, int,
308 struct demangle_component *);
310 static struct demangle_component *
311 d_make_ctor (struct d_info *, enum gnu_v3_ctor_kinds,
312 struct demangle_component *);
314 static struct demangle_component *
315 d_make_dtor (struct d_info *, enum gnu_v3_dtor_kinds,
316 struct demangle_component *);
318 static struct demangle_component *
319 d_make_template_param (struct d_info *, long);
321 static struct demangle_component *
322 d_make_sub (struct d_info *, const char *, int);
324 static int
325 has_return_type (struct demangle_component *);
327 static int
328 is_ctor_dtor_or_conversion (struct demangle_component *);
330 static struct demangle_component *d_encoding (struct d_info *, int);
332 static struct demangle_component *d_name (struct d_info *);
334 static struct demangle_component *d_nested_name (struct d_info *);
336 static struct demangle_component *d_prefix (struct d_info *);
338 static struct demangle_component *d_unqualified_name (struct d_info *);
340 static struct demangle_component *d_source_name (struct d_info *);
342 static long d_number (struct d_info *);
344 static struct demangle_component *d_identifier (struct d_info *, int);
346 static struct demangle_component *d_operator_name (struct d_info *);
348 static struct demangle_component *d_special_name (struct d_info *);
350 static int d_call_offset (struct d_info *, int);
352 static struct demangle_component *d_ctor_dtor_name (struct d_info *);
354 static struct demangle_component **
355 d_cv_qualifiers (struct d_info *, struct demangle_component **, int);
357 static struct demangle_component *
358 d_function_type (struct d_info *);
360 static struct demangle_component *
361 d_bare_function_type (struct d_info *, int);
363 static struct demangle_component *
364 d_class_enum_type (struct d_info *);
366 static struct demangle_component *d_array_type (struct d_info *);
368 static struct demangle_component *
369 d_pointer_to_member_type (struct d_info *);
371 static struct demangle_component *
372 d_template_param (struct d_info *);
374 static struct demangle_component *d_template_args (struct d_info *);
376 static struct demangle_component *
377 d_template_arg (struct d_info *);
379 static struct demangle_component *d_expression (struct d_info *);
381 static struct demangle_component *d_expr_primary (struct d_info *);
383 static struct demangle_component *d_local_name (struct d_info *);
385 static int d_discriminator (struct d_info *);
387 static int
388 d_add_substitution (struct d_info *, struct demangle_component *);
390 static struct demangle_component *d_substitution (struct d_info *, int);
392 static void d_print_resize (struct d_print_info *, size_t);
394 static void d_print_append_char (struct d_print_info *, int);
396 static void
397 d_print_append_buffer (struct d_print_info *, const char *, size_t);
399 static void d_print_error (struct d_print_info *);
401 static void
402 d_print_comp (struct d_print_info *, const struct demangle_component *);
404 static void
405 d_print_java_identifier (struct d_print_info *, const char *, int);
407 static void
408 d_print_mod_list (struct d_print_info *, struct d_print_mod *, int);
410 static void
411 d_print_mod (struct d_print_info *, const struct demangle_component *);
413 static void
414 d_print_function_type (struct d_print_info *,
415 const struct demangle_component *,
416 struct d_print_mod *);
418 static void
419 d_print_array_type (struct d_print_info *,
420 const struct demangle_component *,
421 struct d_print_mod *);
423 static void
424 d_print_expr_op (struct d_print_info *, const struct demangle_component *);
426 static void
427 d_print_cast (struct d_print_info *, const struct demangle_component *);
429 static char *d_demangle (const char *, int, size_t *);
431 #ifdef CP_DEMANGLE_DEBUG
433 static void
434 d_dump (struct demangle_component *dc, int indent)
436 int i;
438 if (dc == NULL)
439 return;
441 for (i = 0; i < indent; ++i)
442 putchar (' ');
444 switch (dc->type)
446 case DEMANGLE_COMPONENT_NAME:
447 printf ("name '%.*s'\n", dc->u.s_name.len, dc->u.s_name.s);
448 return;
449 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
450 printf ("template parameter %ld\n", dc->u.s_number.number);
451 return;
452 case DEMANGLE_COMPONENT_CTOR:
453 printf ("constructor %d\n", (int) dc->u.s_ctor.kind);
454 d_dump (dc->u.s_ctor.name, indent + 2);
455 return;
456 case DEMANGLE_COMPONENT_DTOR:
457 printf ("destructor %d\n", (int) dc->u.s_dtor.kind);
458 d_dump (dc->u.s_dtor.name, indent + 2);
459 return;
460 case DEMANGLE_COMPONENT_SUB_STD:
461 printf ("standard substitution %s\n", dc->u.s_string.string);
462 return;
463 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
464 printf ("builtin type %s\n", dc->u.s_builtin.type->name);
465 return;
466 case DEMANGLE_COMPONENT_OPERATOR:
467 printf ("operator %s\n", dc->u.s_operator.op->name);
468 return;
469 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
470 printf ("extended operator with %d args\n",
471 dc->u.s_extended_operator.args);
472 d_dump (dc->u.s_extended_operator.name, indent + 2);
473 return;
475 case DEMANGLE_COMPONENT_QUAL_NAME:
476 printf ("qualified name\n");
477 break;
478 case DEMANGLE_COMPONENT_LOCAL_NAME:
479 printf ("local name\n");
480 break;
481 case DEMANGLE_COMPONENT_TYPED_NAME:
482 printf ("typed name\n");
483 break;
484 case DEMANGLE_COMPONENT_TEMPLATE:
485 printf ("template\n");
486 break;
487 case DEMANGLE_COMPONENT_VTABLE:
488 printf ("vtable\n");
489 break;
490 case DEMANGLE_COMPONENT_VTT:
491 printf ("VTT\n");
492 break;
493 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
494 printf ("construction vtable\n");
495 break;
496 case DEMANGLE_COMPONENT_TYPEINFO:
497 printf ("typeinfo\n");
498 break;
499 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
500 printf ("typeinfo name\n");
501 break;
502 case DEMANGLE_COMPONENT_TYPEINFO_FN:
503 printf ("typeinfo function\n");
504 break;
505 case DEMANGLE_COMPONENT_THUNK:
506 printf ("thunk\n");
507 break;
508 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
509 printf ("virtual thunk\n");
510 break;
511 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
512 printf ("covariant thunk\n");
513 break;
514 case DEMANGLE_COMPONENT_JAVA_CLASS:
515 printf ("java class\n");
516 break;
517 case DEMANGLE_COMPONENT_GUARD:
518 printf ("guard\n");
519 break;
520 case DEMANGLE_COMPONENT_REFTEMP:
521 printf ("reference temporary\n");
522 break;
523 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
524 printf ("hidden alias\n");
525 break;
526 case DEMANGLE_COMPONENT_RESTRICT:
527 printf ("restrict\n");
528 break;
529 case DEMANGLE_COMPONENT_VOLATILE:
530 printf ("volatile\n");
531 break;
532 case DEMANGLE_COMPONENT_CONST:
533 printf ("const\n");
534 break;
535 case DEMANGLE_COMPONENT_RESTRICT_THIS:
536 printf ("restrict this\n");
537 break;
538 case DEMANGLE_COMPONENT_VOLATILE_THIS:
539 printf ("volatile this\n");
540 break;
541 case DEMANGLE_COMPONENT_CONST_THIS:
542 printf ("const this\n");
543 break;
544 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
545 printf ("vendor type qualifier\n");
546 break;
547 case DEMANGLE_COMPONENT_POINTER:
548 printf ("pointer\n");
549 break;
550 case DEMANGLE_COMPONENT_REFERENCE:
551 printf ("reference\n");
552 break;
553 case DEMANGLE_COMPONENT_COMPLEX:
554 printf ("complex\n");
555 break;
556 case DEMANGLE_COMPONENT_IMAGINARY:
557 printf ("imaginary\n");
558 break;
559 case DEMANGLE_COMPONENT_VENDOR_TYPE:
560 printf ("vendor type\n");
561 break;
562 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
563 printf ("function type\n");
564 break;
565 case DEMANGLE_COMPONENT_ARRAY_TYPE:
566 printf ("array type\n");
567 break;
568 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
569 printf ("pointer to member type\n");
570 break;
571 case DEMANGLE_COMPONENT_ARGLIST:
572 printf ("argument list\n");
573 break;
574 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
575 printf ("template argument list\n");
576 break;
577 case DEMANGLE_COMPONENT_CAST:
578 printf ("cast\n");
579 break;
580 case DEMANGLE_COMPONENT_UNARY:
581 printf ("unary operator\n");
582 break;
583 case DEMANGLE_COMPONENT_BINARY:
584 printf ("binary operator\n");
585 break;
586 case DEMANGLE_COMPONENT_BINARY_ARGS:
587 printf ("binary operator arguments\n");
588 break;
589 case DEMANGLE_COMPONENT_TRINARY:
590 printf ("trinary operator\n");
591 break;
592 case DEMANGLE_COMPONENT_TRINARY_ARG1:
593 printf ("trinary operator arguments 1\n");
594 break;
595 case DEMANGLE_COMPONENT_TRINARY_ARG2:
596 printf ("trinary operator arguments 1\n");
597 break;
598 case DEMANGLE_COMPONENT_LITERAL:
599 printf ("literal\n");
600 break;
601 case DEMANGLE_COMPONENT_LITERAL_NEG:
602 printf ("negative literal\n");
603 break;
606 d_dump (d_left (dc), indent + 2);
607 d_dump (d_right (dc), indent + 2);
610 #endif /* CP_DEMANGLE_DEBUG */
612 /* Fill in a DEMANGLE_COMPONENT_NAME. */
614 CP_STATIC_IF_GLIBCPP_V3
616 cplus_demangle_fill_name (struct demangle_component *p, const char *s, int len)
618 if (p == NULL || s == NULL || len == 0)
619 return 0;
620 p->type = DEMANGLE_COMPONENT_NAME;
621 p->u.s_name.s = s;
622 p->u.s_name.len = len;
623 return 1;
626 /* Fill in a DEMANGLE_COMPONENT_EXTENDED_OPERATOR. */
628 CP_STATIC_IF_GLIBCPP_V3
630 cplus_demangle_fill_extended_operator (struct demangle_component *p, int args,
631 struct demangle_component *name)
633 if (p == NULL || args < 0 || name == NULL)
634 return 0;
635 p->type = DEMANGLE_COMPONENT_EXTENDED_OPERATOR;
636 p->u.s_extended_operator.args = args;
637 p->u.s_extended_operator.name = name;
638 return 1;
641 /* Fill in a DEMANGLE_COMPONENT_CTOR. */
643 CP_STATIC_IF_GLIBCPP_V3
645 cplus_demangle_fill_ctor (struct demangle_component *p,
646 enum gnu_v3_ctor_kinds kind,
647 struct demangle_component *name)
649 if (p == NULL
650 || name == NULL
651 || (kind < gnu_v3_complete_object_ctor
652 && kind > gnu_v3_complete_object_allocating_ctor))
653 return 0;
654 p->type = DEMANGLE_COMPONENT_CTOR;
655 p->u.s_ctor.kind = kind;
656 p->u.s_ctor.name = name;
657 return 1;
660 /* Fill in a DEMANGLE_COMPONENT_DTOR. */
662 CP_STATIC_IF_GLIBCPP_V3
664 cplus_demangle_fill_dtor (struct demangle_component *p,
665 enum gnu_v3_dtor_kinds kind,
666 struct demangle_component *name)
668 if (p == NULL
669 || name == NULL
670 || (kind < gnu_v3_deleting_dtor
671 && kind > gnu_v3_base_object_dtor))
672 return 0;
673 p->type = DEMANGLE_COMPONENT_DTOR;
674 p->u.s_dtor.kind = kind;
675 p->u.s_dtor.name = name;
676 return 1;
679 /* Add a new component. */
681 static struct demangle_component *
682 d_make_empty (struct d_info *di)
684 struct demangle_component *p;
686 if (di->next_comp >= di->num_comps)
687 return NULL;
688 p = &di->comps[di->next_comp];
689 ++di->next_comp;
690 return p;
693 /* Add a new generic component. */
695 static struct demangle_component *
696 d_make_comp (struct d_info *di, enum demangle_component_type type,
697 struct demangle_component *left,
698 struct demangle_component *right)
700 struct demangle_component *p;
702 /* We check for errors here. A typical error would be a NULL return
703 from a subroutine. We catch those here, and return NULL
704 upward. */
705 switch (type)
707 /* These types require two parameters. */
708 case DEMANGLE_COMPONENT_QUAL_NAME:
709 case DEMANGLE_COMPONENT_LOCAL_NAME:
710 case DEMANGLE_COMPONENT_TYPED_NAME:
711 case DEMANGLE_COMPONENT_TEMPLATE:
712 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
713 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
714 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
715 case DEMANGLE_COMPONENT_UNARY:
716 case DEMANGLE_COMPONENT_BINARY:
717 case DEMANGLE_COMPONENT_BINARY_ARGS:
718 case DEMANGLE_COMPONENT_TRINARY:
719 case DEMANGLE_COMPONENT_TRINARY_ARG1:
720 case DEMANGLE_COMPONENT_TRINARY_ARG2:
721 case DEMANGLE_COMPONENT_LITERAL:
722 case DEMANGLE_COMPONENT_LITERAL_NEG:
723 if (left == NULL || right == NULL)
724 return NULL;
725 break;
727 /* These types only require one parameter. */
728 case DEMANGLE_COMPONENT_VTABLE:
729 case DEMANGLE_COMPONENT_VTT:
730 case DEMANGLE_COMPONENT_TYPEINFO:
731 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
732 case DEMANGLE_COMPONENT_TYPEINFO_FN:
733 case DEMANGLE_COMPONENT_THUNK:
734 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
735 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
736 case DEMANGLE_COMPONENT_JAVA_CLASS:
737 case DEMANGLE_COMPONENT_GUARD:
738 case DEMANGLE_COMPONENT_REFTEMP:
739 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
740 case DEMANGLE_COMPONENT_POINTER:
741 case DEMANGLE_COMPONENT_REFERENCE:
742 case DEMANGLE_COMPONENT_COMPLEX:
743 case DEMANGLE_COMPONENT_IMAGINARY:
744 case DEMANGLE_COMPONENT_VENDOR_TYPE:
745 case DEMANGLE_COMPONENT_ARGLIST:
746 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
747 case DEMANGLE_COMPONENT_CAST:
748 if (left == NULL)
749 return NULL;
750 break;
752 /* This needs a right parameter, but the left parameter can be
753 empty. */
754 case DEMANGLE_COMPONENT_ARRAY_TYPE:
755 if (right == NULL)
756 return NULL;
757 break;
759 /* These are allowed to have no parameters--in some cases they
760 will be filled in later. */
761 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
762 case DEMANGLE_COMPONENT_RESTRICT:
763 case DEMANGLE_COMPONENT_VOLATILE:
764 case DEMANGLE_COMPONENT_CONST:
765 case DEMANGLE_COMPONENT_RESTRICT_THIS:
766 case DEMANGLE_COMPONENT_VOLATILE_THIS:
767 case DEMANGLE_COMPONENT_CONST_THIS:
768 break;
770 /* Other types should not be seen here. */
771 default:
772 return NULL;
775 p = d_make_empty (di);
776 if (p != NULL)
778 p->type = type;
779 p->u.s_binary.left = left;
780 p->u.s_binary.right = right;
782 return p;
785 /* Add a new name component. */
787 static struct demangle_component *
788 d_make_name (struct d_info *di, const char *s, int len)
790 struct demangle_component *p;
792 p = d_make_empty (di);
793 if (! cplus_demangle_fill_name (p, s, len))
794 return NULL;
795 return p;
798 /* Add a new builtin type component. */
800 static struct demangle_component *
801 d_make_builtin_type (struct d_info *di,
802 const struct demangle_builtin_type_info *type)
804 struct demangle_component *p;
806 if (type == NULL)
807 return NULL;
808 p = d_make_empty (di);
809 if (p != NULL)
811 p->type = DEMANGLE_COMPONENT_BUILTIN_TYPE;
812 p->u.s_builtin.type = type;
814 return p;
817 /* Add a new operator component. */
819 static struct demangle_component *
820 d_make_operator (struct d_info *di, const struct demangle_operator_info *op)
822 struct demangle_component *p;
824 p = d_make_empty (di);
825 if (p != NULL)
827 p->type = DEMANGLE_COMPONENT_OPERATOR;
828 p->u.s_operator.op = op;
830 return p;
833 /* Add a new extended operator component. */
835 static struct demangle_component *
836 d_make_extended_operator (struct d_info *di, int args,
837 struct demangle_component *name)
839 struct demangle_component *p;
841 p = d_make_empty (di);
842 if (! cplus_demangle_fill_extended_operator (p, args, name))
843 return NULL;
844 return p;
847 /* Add a new constructor component. */
849 static struct demangle_component *
850 d_make_ctor (struct d_info *di, enum gnu_v3_ctor_kinds kind,
851 struct demangle_component *name)
853 struct demangle_component *p;
855 p = d_make_empty (di);
856 if (! cplus_demangle_fill_ctor (p, kind, name))
857 return NULL;
858 return p;
861 /* Add a new destructor component. */
863 static struct demangle_component *
864 d_make_dtor (struct d_info *di, enum gnu_v3_dtor_kinds kind,
865 struct demangle_component *name)
867 struct demangle_component *p;
869 p = d_make_empty (di);
870 if (! cplus_demangle_fill_dtor (p, kind, name))
871 return NULL;
872 return p;
875 /* Add a new template parameter. */
877 static struct demangle_component *
878 d_make_template_param (struct d_info *di, long i)
880 struct demangle_component *p;
882 p = d_make_empty (di);
883 if (p != NULL)
885 p->type = DEMANGLE_COMPONENT_TEMPLATE_PARAM;
886 p->u.s_number.number = i;
888 return p;
891 /* Add a new standard substitution component. */
893 static struct demangle_component *
894 d_make_sub (struct d_info *di, const char *name, int len)
896 struct demangle_component *p;
898 p = d_make_empty (di);
899 if (p != NULL)
901 p->type = DEMANGLE_COMPONENT_SUB_STD;
902 p->u.s_string.string = name;
903 p->u.s_string.len = len;
905 return p;
908 /* <mangled-name> ::= _Z <encoding>
910 TOP_LEVEL is non-zero when called at the top level. */
912 CP_STATIC_IF_GLIBCPP_V3
913 struct demangle_component *
914 cplus_demangle_mangled_name (struct d_info *di, int top_level)
916 if (d_next_char (di) != '_')
917 return NULL;
918 if (d_next_char (di) != 'Z')
919 return NULL;
920 return d_encoding (di, top_level);
923 /* Return whether a function should have a return type. The argument
924 is the function name, which may be qualified in various ways. The
925 rules are that template functions have return types with some
926 exceptions, function types which are not part of a function name
927 mangling have return types with some exceptions, and non-template
928 function names do not have return types. The exceptions are that
929 constructors, destructors, and conversion operators do not have
930 return types. */
932 static int
933 has_return_type (struct demangle_component *dc)
935 if (dc == NULL)
936 return 0;
937 switch (dc->type)
939 default:
940 return 0;
941 case DEMANGLE_COMPONENT_TEMPLATE:
942 return ! is_ctor_dtor_or_conversion (d_left (dc));
943 case DEMANGLE_COMPONENT_RESTRICT_THIS:
944 case DEMANGLE_COMPONENT_VOLATILE_THIS:
945 case DEMANGLE_COMPONENT_CONST_THIS:
946 return has_return_type (d_left (dc));
950 /* Return whether a name is a constructor, a destructor, or a
951 conversion operator. */
953 static int
954 is_ctor_dtor_or_conversion (struct demangle_component *dc)
956 if (dc == NULL)
957 return 0;
958 switch (dc->type)
960 default:
961 return 0;
962 case DEMANGLE_COMPONENT_QUAL_NAME:
963 case DEMANGLE_COMPONENT_LOCAL_NAME:
964 return is_ctor_dtor_or_conversion (d_right (dc));
965 case DEMANGLE_COMPONENT_CTOR:
966 case DEMANGLE_COMPONENT_DTOR:
967 case DEMANGLE_COMPONENT_CAST:
968 return 1;
972 /* <encoding> ::= <(function) name> <bare-function-type>
973 ::= <(data) name>
974 ::= <special-name>
976 TOP_LEVEL is non-zero when called at the top level, in which case
977 if DMGL_PARAMS is not set we do not demangle the function
978 parameters. We only set this at the top level, because otherwise
979 we would not correctly demangle names in local scopes. */
981 static struct demangle_component *
982 d_encoding (struct d_info *di, int top_level)
984 char peek = d_peek_char (di);
986 if (peek == 'G' || peek == 'T')
987 return d_special_name (di);
988 else
990 struct demangle_component *dc;
992 dc = d_name (di);
994 if (dc != NULL && top_level && (di->options & DMGL_PARAMS) == 0)
996 /* Strip off any initial CV-qualifiers, as they really apply
997 to the `this' parameter, and they were not output by the
998 v2 demangler without DMGL_PARAMS. */
999 while (dc->type == DEMANGLE_COMPONENT_RESTRICT_THIS
1000 || dc->type == DEMANGLE_COMPONENT_VOLATILE_THIS
1001 || dc->type == DEMANGLE_COMPONENT_CONST_THIS)
1002 dc = d_left (dc);
1004 /* If the top level is a DEMANGLE_COMPONENT_LOCAL_NAME, then
1005 there may be CV-qualifiers on its right argument which
1006 really apply here; this happens when parsing a class
1007 which is local to a function. */
1008 if (dc->type == DEMANGLE_COMPONENT_LOCAL_NAME)
1010 struct demangle_component *dcr;
1012 dcr = d_right (dc);
1013 while (dcr->type == DEMANGLE_COMPONENT_RESTRICT_THIS
1014 || dcr->type == DEMANGLE_COMPONENT_VOLATILE_THIS
1015 || dcr->type == DEMANGLE_COMPONENT_CONST_THIS)
1016 dcr = d_left (dcr);
1017 dc->u.s_binary.right = dcr;
1020 return dc;
1023 peek = d_peek_char (di);
1024 if (peek == '\0' || peek == 'E')
1025 return dc;
1026 return d_make_comp (di, DEMANGLE_COMPONENT_TYPED_NAME, dc,
1027 d_bare_function_type (di, has_return_type (dc)));
1031 /* <name> ::= <nested-name>
1032 ::= <unscoped-name>
1033 ::= <unscoped-template-name> <template-args>
1034 ::= <local-name>
1036 <unscoped-name> ::= <unqualified-name>
1037 ::= St <unqualified-name>
1039 <unscoped-template-name> ::= <unscoped-name>
1040 ::= <substitution>
1043 static struct demangle_component *
1044 d_name (struct d_info *di)
1046 char peek = d_peek_char (di);
1047 struct demangle_component *dc;
1049 switch (peek)
1051 case 'N':
1052 return d_nested_name (di);
1054 case 'Z':
1055 return d_local_name (di);
1057 case 'S':
1059 int subst;
1061 if (d_peek_next_char (di) != 't')
1063 dc = d_substitution (di, 0);
1064 subst = 1;
1066 else
1068 d_advance (di, 2);
1069 dc = d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME,
1070 d_make_name (di, "std", 3),
1071 d_unqualified_name (di));
1072 di->expansion += 3;
1073 subst = 0;
1076 if (d_peek_char (di) != 'I')
1078 /* The grammar does not permit this case to occur if we
1079 called d_substitution() above (i.e., subst == 1). We
1080 don't bother to check. */
1082 else
1084 /* This is <template-args>, which means that we just saw
1085 <unscoped-template-name>, which is a substitution
1086 candidate if we didn't just get it from a
1087 substitution. */
1088 if (! subst)
1090 if (! d_add_substitution (di, dc))
1091 return NULL;
1093 dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc,
1094 d_template_args (di));
1097 return dc;
1100 default:
1101 dc = d_unqualified_name (di);
1102 if (d_peek_char (di) == 'I')
1104 /* This is <template-args>, which means that we just saw
1105 <unscoped-template-name>, which is a substitution
1106 candidate. */
1107 if (! d_add_substitution (di, dc))
1108 return NULL;
1109 dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc,
1110 d_template_args (di));
1112 return dc;
1116 /* <nested-name> ::= N [<CV-qualifiers>] <prefix> <unqualified-name> E
1117 ::= N [<CV-qualifiers>] <template-prefix> <template-args> E
1120 static struct demangle_component *
1121 d_nested_name (struct d_info *di)
1123 struct demangle_component *ret;
1124 struct demangle_component **pret;
1126 if (d_next_char (di) != 'N')
1127 return NULL;
1129 pret = d_cv_qualifiers (di, &ret, 1);
1130 if (pret == NULL)
1131 return NULL;
1133 *pret = d_prefix (di);
1134 if (*pret == NULL)
1135 return NULL;
1137 if (d_next_char (di) != 'E')
1138 return NULL;
1140 return ret;
1143 /* <prefix> ::= <prefix> <unqualified-name>
1144 ::= <template-prefix> <template-args>
1145 ::= <template-param>
1147 ::= <substitution>
1149 <template-prefix> ::= <prefix> <(template) unqualified-name>
1150 ::= <template-param>
1151 ::= <substitution>
1154 static struct demangle_component *
1155 d_prefix (struct d_info *di)
1157 struct demangle_component *ret = NULL;
1159 while (1)
1161 char peek;
1162 enum demangle_component_type comb_type;
1163 struct demangle_component *dc;
1165 peek = d_peek_char (di);
1166 if (peek == '\0')
1167 return NULL;
1169 /* The older code accepts a <local-name> here, but I don't see
1170 that in the grammar. The older code does not accept a
1171 <template-param> here. */
1173 comb_type = DEMANGLE_COMPONENT_QUAL_NAME;
1174 if (IS_DIGIT (peek)
1175 || IS_LOWER (peek)
1176 || peek == 'C'
1177 || peek == 'D')
1178 dc = d_unqualified_name (di);
1179 else if (peek == 'S')
1180 dc = d_substitution (di, 1);
1181 else if (peek == 'I')
1183 if (ret == NULL)
1184 return NULL;
1185 comb_type = DEMANGLE_COMPONENT_TEMPLATE;
1186 dc = d_template_args (di);
1188 else if (peek == 'T')
1189 dc = d_template_param (di);
1190 else if (peek == 'E')
1191 return ret;
1192 else
1193 return NULL;
1195 if (ret == NULL)
1196 ret = dc;
1197 else
1198 ret = d_make_comp (di, comb_type, ret, dc);
1200 if (peek != 'S' && d_peek_char (di) != 'E')
1202 if (! d_add_substitution (di, ret))
1203 return NULL;
1208 /* <unqualified-name> ::= <operator-name>
1209 ::= <ctor-dtor-name>
1210 ::= <source-name>
1213 static struct demangle_component *
1214 d_unqualified_name (struct d_info *di)
1216 char peek;
1218 peek = d_peek_char (di);
1219 if (IS_DIGIT (peek))
1220 return d_source_name (di);
1221 else if (IS_LOWER (peek))
1223 struct demangle_component *ret;
1225 ret = d_operator_name (di);
1226 if (ret != NULL && ret->type == DEMANGLE_COMPONENT_OPERATOR)
1227 di->expansion += sizeof "operator" + ret->u.s_operator.op->len - 2;
1228 return ret;
1230 else if (peek == 'C' || peek == 'D')
1231 return d_ctor_dtor_name (di);
1232 else
1233 return NULL;
1236 /* <source-name> ::= <(positive length) number> <identifier> */
1238 static struct demangle_component *
1239 d_source_name (struct d_info *di)
1241 long len;
1242 struct demangle_component *ret;
1244 len = d_number (di);
1245 if (len <= 0)
1246 return NULL;
1247 ret = d_identifier (di, len);
1248 di->last_name = ret;
1249 return ret;
1252 /* number ::= [n] <(non-negative decimal integer)> */
1254 static long
1255 d_number (struct d_info *di)
1257 int negative;
1258 char peek;
1259 long ret;
1261 negative = 0;
1262 peek = d_peek_char (di);
1263 if (peek == 'n')
1265 negative = 1;
1266 d_advance (di, 1);
1267 peek = d_peek_char (di);
1270 ret = 0;
1271 while (1)
1273 if (! IS_DIGIT (peek))
1275 if (negative)
1276 ret = - ret;
1277 return ret;
1279 ret = ret * 10 + peek - '0';
1280 d_advance (di, 1);
1281 peek = d_peek_char (di);
1285 /* identifier ::= <(unqualified source code identifier)> */
1287 static struct demangle_component *
1288 d_identifier (struct d_info *di, int len)
1290 const char *name;
1292 name = d_str (di);
1294 if (di->send - name < len)
1295 return NULL;
1297 d_advance (di, len);
1299 /* A Java mangled name may have a trailing '$' if it is a C++
1300 keyword. This '$' is not included in the length count. We just
1301 ignore the '$'. */
1302 if ((di->options & DMGL_JAVA) != 0
1303 && d_peek_char (di) == '$')
1304 d_advance (di, 1);
1306 /* Look for something which looks like a gcc encoding of an
1307 anonymous namespace, and replace it with a more user friendly
1308 name. */
1309 if (len >= (int) ANONYMOUS_NAMESPACE_PREFIX_LEN + 2
1310 && memcmp (name, ANONYMOUS_NAMESPACE_PREFIX,
1311 ANONYMOUS_NAMESPACE_PREFIX_LEN) == 0)
1313 const char *s;
1315 s = name + ANONYMOUS_NAMESPACE_PREFIX_LEN;
1316 if ((*s == '.' || *s == '_' || *s == '$')
1317 && s[1] == 'N')
1319 di->expansion -= len - sizeof "(anonymous namespace)";
1320 return d_make_name (di, "(anonymous namespace)",
1321 sizeof "(anonymous namespace)" - 1);
1325 return d_make_name (di, name, len);
1328 /* operator_name ::= many different two character encodings.
1329 ::= cv <type>
1330 ::= v <digit> <source-name>
1333 #define NL(s) s, (sizeof s) - 1
1335 CP_STATIC_IF_GLIBCPP_V3
1336 const struct demangle_operator_info cplus_demangle_operators[] =
1338 { "aN", NL ("&="), 2 },
1339 { "aS", NL ("="), 2 },
1340 { "aa", NL ("&&"), 2 },
1341 { "ad", NL ("&"), 1 },
1342 { "an", NL ("&"), 2 },
1343 { "cl", NL ("()"), 0 },
1344 { "cm", NL (","), 2 },
1345 { "co", NL ("~"), 1 },
1346 { "dV", NL ("/="), 2 },
1347 { "da", NL ("delete[]"), 1 },
1348 { "de", NL ("*"), 1 },
1349 { "dl", NL ("delete"), 1 },
1350 { "dv", NL ("/"), 2 },
1351 { "eO", NL ("^="), 2 },
1352 { "eo", NL ("^"), 2 },
1353 { "eq", NL ("=="), 2 },
1354 { "ge", NL (">="), 2 },
1355 { "gt", NL (">"), 2 },
1356 { "ix", NL ("[]"), 2 },
1357 { "lS", NL ("<<="), 2 },
1358 { "le", NL ("<="), 2 },
1359 { "ls", NL ("<<"), 2 },
1360 { "lt", NL ("<"), 2 },
1361 { "mI", NL ("-="), 2 },
1362 { "mL", NL ("*="), 2 },
1363 { "mi", NL ("-"), 2 },
1364 { "ml", NL ("*"), 2 },
1365 { "mm", NL ("--"), 1 },
1366 { "na", NL ("new[]"), 1 },
1367 { "ne", NL ("!="), 2 },
1368 { "ng", NL ("-"), 1 },
1369 { "nt", NL ("!"), 1 },
1370 { "nw", NL ("new"), 1 },
1371 { "oR", NL ("|="), 2 },
1372 { "oo", NL ("||"), 2 },
1373 { "or", NL ("|"), 2 },
1374 { "pL", NL ("+="), 2 },
1375 { "pl", NL ("+"), 2 },
1376 { "pm", NL ("->*"), 2 },
1377 { "pp", NL ("++"), 1 },
1378 { "ps", NL ("+"), 1 },
1379 { "pt", NL ("->"), 2 },
1380 { "qu", NL ("?"), 3 },
1381 { "rM", NL ("%="), 2 },
1382 { "rS", NL (">>="), 2 },
1383 { "rm", NL ("%"), 2 },
1384 { "rs", NL (">>"), 2 },
1385 { "st", NL ("sizeof "), 1 },
1386 { "sz", NL ("sizeof "), 1 },
1387 { NULL, NULL, 0, 0 }
1390 static struct demangle_component *
1391 d_operator_name (struct d_info *di)
1393 char c1;
1394 char c2;
1396 c1 = d_next_char (di);
1397 c2 = d_next_char (di);
1398 if (c1 == 'v' && IS_DIGIT (c2))
1399 return d_make_extended_operator (di, c2 - '0', d_source_name (di));
1400 else if (c1 == 'c' && c2 == 'v')
1401 return d_make_comp (di, DEMANGLE_COMPONENT_CAST,
1402 cplus_demangle_type (di), NULL);
1403 else
1405 /* LOW is the inclusive lower bound. */
1406 int low = 0;
1407 /* HIGH is the exclusive upper bound. We subtract one to ignore
1408 the sentinel at the end of the array. */
1409 int high = ((sizeof (cplus_demangle_operators)
1410 / sizeof (cplus_demangle_operators[0]))
1411 - 1);
1413 while (1)
1415 int i;
1416 const struct demangle_operator_info *p;
1418 i = low + (high - low) / 2;
1419 p = cplus_demangle_operators + i;
1421 if (c1 == p->code[0] && c2 == p->code[1])
1422 return d_make_operator (di, p);
1424 if (c1 < p->code[0] || (c1 == p->code[0] && c2 < p->code[1]))
1425 high = i;
1426 else
1427 low = i + 1;
1428 if (low == high)
1429 return NULL;
1434 /* <special-name> ::= TV <type>
1435 ::= TT <type>
1436 ::= TI <type>
1437 ::= TS <type>
1438 ::= GV <(object) name>
1439 ::= T <call-offset> <(base) encoding>
1440 ::= Tc <call-offset> <call-offset> <(base) encoding>
1441 Also g++ extensions:
1442 ::= TC <type> <(offset) number> _ <(base) type>
1443 ::= TF <type>
1444 ::= TJ <type>
1445 ::= GR <name>
1446 ::= GA <encoding>
1449 static struct demangle_component *
1450 d_special_name (struct d_info *di)
1452 char c;
1454 di->expansion += 20;
1455 c = d_next_char (di);
1456 if (c == 'T')
1458 switch (d_next_char (di))
1460 case 'V':
1461 di->expansion -= 5;
1462 return d_make_comp (di, DEMANGLE_COMPONENT_VTABLE,
1463 cplus_demangle_type (di), NULL);
1464 case 'T':
1465 di->expansion -= 10;
1466 return d_make_comp (di, DEMANGLE_COMPONENT_VTT,
1467 cplus_demangle_type (di), NULL);
1468 case 'I':
1469 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO,
1470 cplus_demangle_type (di), NULL);
1471 case 'S':
1472 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_NAME,
1473 cplus_demangle_type (di), NULL);
1475 case 'h':
1476 if (! d_call_offset (di, 'h'))
1477 return NULL;
1478 return d_make_comp (di, DEMANGLE_COMPONENT_THUNK,
1479 d_encoding (di, 0), NULL);
1481 case 'v':
1482 if (! d_call_offset (di, 'v'))
1483 return NULL;
1484 return d_make_comp (di, DEMANGLE_COMPONENT_VIRTUAL_THUNK,
1485 d_encoding (di, 0), NULL);
1487 case 'c':
1488 if (! d_call_offset (di, '\0'))
1489 return NULL;
1490 if (! d_call_offset (di, '\0'))
1491 return NULL;
1492 return d_make_comp (di, DEMANGLE_COMPONENT_COVARIANT_THUNK,
1493 d_encoding (di, 0), NULL);
1495 case 'C':
1497 struct demangle_component *derived_type;
1498 long offset;
1499 struct demangle_component *base_type;
1501 derived_type = cplus_demangle_type (di);
1502 offset = d_number (di);
1503 if (offset < 0)
1504 return NULL;
1505 if (d_next_char (di) != '_')
1506 return NULL;
1507 base_type = cplus_demangle_type (di);
1508 /* We don't display the offset. FIXME: We should display
1509 it in verbose mode. */
1510 di->expansion += 5;
1511 return d_make_comp (di, DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE,
1512 base_type, derived_type);
1515 case 'F':
1516 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_FN,
1517 cplus_demangle_type (di), NULL);
1518 case 'J':
1519 return d_make_comp (di, DEMANGLE_COMPONENT_JAVA_CLASS,
1520 cplus_demangle_type (di), NULL);
1522 default:
1523 return NULL;
1526 else if (c == 'G')
1528 switch (d_next_char (di))
1530 case 'V':
1531 return d_make_comp (di, DEMANGLE_COMPONENT_GUARD, d_name (di), NULL);
1533 case 'R':
1534 return d_make_comp (di, DEMANGLE_COMPONENT_REFTEMP, d_name (di),
1535 NULL);
1537 case 'A':
1538 return d_make_comp (di, DEMANGLE_COMPONENT_HIDDEN_ALIAS,
1539 d_encoding (di, 0), NULL);
1541 default:
1542 return NULL;
1545 else
1546 return NULL;
1549 /* <call-offset> ::= h <nv-offset> _
1550 ::= v <v-offset> _
1552 <nv-offset> ::= <(offset) number>
1554 <v-offset> ::= <(offset) number> _ <(virtual offset) number>
1556 The C parameter, if not '\0', is a character we just read which is
1557 the start of the <call-offset>.
1559 We don't display the offset information anywhere. FIXME: We should
1560 display it in verbose mode. */
1562 static int
1563 d_call_offset (struct d_info *di, int c)
1565 if (c == '\0')
1566 c = d_next_char (di);
1568 if (c == 'h')
1569 d_number (di);
1570 else if (c == 'v')
1572 d_number (di);
1573 if (d_next_char (di) != '_')
1574 return 0;
1575 d_number (di);
1577 else
1578 return 0;
1580 if (d_next_char (di) != '_')
1581 return 0;
1583 return 1;
1586 /* <ctor-dtor-name> ::= C1
1587 ::= C2
1588 ::= C3
1589 ::= D0
1590 ::= D1
1591 ::= D2
1594 static struct demangle_component *
1595 d_ctor_dtor_name (struct d_info *di)
1597 if (di->last_name != NULL)
1599 if (di->last_name->type == DEMANGLE_COMPONENT_NAME)
1600 di->expansion += di->last_name->u.s_name.len;
1601 else if (di->last_name->type == DEMANGLE_COMPONENT_SUB_STD)
1602 di->expansion += di->last_name->u.s_string.len;
1604 switch (d_next_char (di))
1606 case 'C':
1608 enum gnu_v3_ctor_kinds kind;
1610 switch (d_next_char (di))
1612 case '1':
1613 kind = gnu_v3_complete_object_ctor;
1614 break;
1615 case '2':
1616 kind = gnu_v3_base_object_ctor;
1617 break;
1618 case '3':
1619 kind = gnu_v3_complete_object_allocating_ctor;
1620 break;
1621 default:
1622 return NULL;
1624 return d_make_ctor (di, kind, di->last_name);
1627 case 'D':
1629 enum gnu_v3_dtor_kinds kind;
1631 switch (d_next_char (di))
1633 case '0':
1634 kind = gnu_v3_deleting_dtor;
1635 break;
1636 case '1':
1637 kind = gnu_v3_complete_object_dtor;
1638 break;
1639 case '2':
1640 kind = gnu_v3_base_object_dtor;
1641 break;
1642 default:
1643 return NULL;
1645 return d_make_dtor (di, kind, di->last_name);
1648 default:
1649 return NULL;
1653 /* <type> ::= <builtin-type>
1654 ::= <function-type>
1655 ::= <class-enum-type>
1656 ::= <array-type>
1657 ::= <pointer-to-member-type>
1658 ::= <template-param>
1659 ::= <template-template-param> <template-args>
1660 ::= <substitution>
1661 ::= <CV-qualifiers> <type>
1662 ::= P <type>
1663 ::= R <type>
1664 ::= C <type>
1665 ::= G <type>
1666 ::= U <source-name> <type>
1668 <builtin-type> ::= various one letter codes
1669 ::= u <source-name>
1672 CP_STATIC_IF_GLIBCPP_V3
1673 const struct demangle_builtin_type_info
1674 cplus_demangle_builtin_types[D_BUILTIN_TYPE_COUNT] =
1676 /* a */ { NL ("signed char"), NL ("signed char"), D_PRINT_DEFAULT },
1677 /* b */ { NL ("bool"), NL ("boolean"), D_PRINT_BOOL },
1678 /* c */ { NL ("char"), NL ("byte"), D_PRINT_DEFAULT },
1679 /* d */ { NL ("double"), NL ("double"), D_PRINT_FLOAT },
1680 /* e */ { NL ("long double"), NL ("long double"), D_PRINT_FLOAT },
1681 /* f */ { NL ("float"), NL ("float"), D_PRINT_FLOAT },
1682 /* g */ { NL ("__float128"), NL ("__float128"), D_PRINT_FLOAT },
1683 /* h */ { NL ("unsigned char"), NL ("unsigned char"), D_PRINT_DEFAULT },
1684 /* i */ { NL ("int"), NL ("int"), D_PRINT_INT },
1685 /* j */ { NL ("unsigned int"), NL ("unsigned"), D_PRINT_UNSIGNED },
1686 /* k */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
1687 /* l */ { NL ("long"), NL ("long"), D_PRINT_LONG },
1688 /* m */ { NL ("unsigned long"), NL ("unsigned long"), D_PRINT_UNSIGNED_LONG },
1689 /* n */ { NL ("__int128"), NL ("__int128"), D_PRINT_DEFAULT },
1690 /* o */ { NL ("unsigned __int128"), NL ("unsigned __int128"),
1691 D_PRINT_DEFAULT },
1692 /* p */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
1693 /* q */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
1694 /* r */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
1695 /* s */ { NL ("short"), NL ("short"), D_PRINT_DEFAULT },
1696 /* t */ { NL ("unsigned short"), NL ("unsigned short"), D_PRINT_DEFAULT },
1697 /* u */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
1698 /* v */ { NL ("void"), NL ("void"), D_PRINT_VOID },
1699 /* w */ { NL ("wchar_t"), NL ("char"), D_PRINT_DEFAULT },
1700 /* x */ { NL ("long long"), NL ("long"), D_PRINT_LONG_LONG },
1701 /* y */ { NL ("unsigned long long"), NL ("unsigned long long"),
1702 D_PRINT_UNSIGNED_LONG_LONG },
1703 /* z */ { NL ("..."), NL ("..."), D_PRINT_DEFAULT },
1706 CP_STATIC_IF_GLIBCPP_V3
1707 struct demangle_component *
1708 cplus_demangle_type (struct d_info *di)
1710 char peek;
1711 struct demangle_component *ret;
1712 int can_subst;
1714 /* The ABI specifies that when CV-qualifiers are used, the base type
1715 is substitutable, and the fully qualified type is substitutable,
1716 but the base type with a strict subset of the CV-qualifiers is
1717 not substitutable. The natural recursive implementation of the
1718 CV-qualifiers would cause subsets to be substitutable, so instead
1719 we pull them all off now.
1721 FIXME: The ABI says that order-insensitive vendor qualifiers
1722 should be handled in the same way, but we have no way to tell
1723 which vendor qualifiers are order-insensitive and which are
1724 order-sensitive. So we just assume that they are all
1725 order-sensitive. g++ 3.4 supports only one vendor qualifier,
1726 __vector, and it treats it as order-sensitive when mangling
1727 names. */
1729 peek = d_peek_char (di);
1730 if (peek == 'r' || peek == 'V' || peek == 'K')
1732 struct demangle_component **pret;
1734 pret = d_cv_qualifiers (di, &ret, 0);
1735 if (pret == NULL)
1736 return NULL;
1737 *pret = cplus_demangle_type (di);
1738 if (! d_add_substitution (di, ret))
1739 return NULL;
1740 return ret;
1743 can_subst = 1;
1745 switch (peek)
1747 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
1748 case 'h': case 'i': case 'j': case 'l': case 'm': case 'n':
1749 case 'o': case 's': case 't':
1750 case 'v': case 'w': case 'x': case 'y': case 'z':
1751 ret = d_make_builtin_type (di,
1752 &cplus_demangle_builtin_types[peek - 'a']);
1753 di->expansion += ret->u.s_builtin.type->len;
1754 can_subst = 0;
1755 d_advance (di, 1);
1756 break;
1758 case 'u':
1759 d_advance (di, 1);
1760 ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE,
1761 d_source_name (di), NULL);
1762 break;
1764 case 'F':
1765 ret = d_function_type (di);
1766 break;
1768 case '0': case '1': case '2': case '3': case '4':
1769 case '5': case '6': case '7': case '8': case '9':
1770 case 'N':
1771 case 'Z':
1772 ret = d_class_enum_type (di);
1773 break;
1775 case 'A':
1776 ret = d_array_type (di);
1777 break;
1779 case 'M':
1780 ret = d_pointer_to_member_type (di);
1781 break;
1783 case 'T':
1784 ret = d_template_param (di);
1785 if (d_peek_char (di) == 'I')
1787 /* This is <template-template-param> <template-args>. The
1788 <template-template-param> part is a substitution
1789 candidate. */
1790 if (! d_add_substitution (di, ret))
1791 return NULL;
1792 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
1793 d_template_args (di));
1795 break;
1797 case 'S':
1798 /* If this is a special substitution, then it is the start of
1799 <class-enum-type>. */
1801 char peek_next;
1803 peek_next = d_peek_next_char (di);
1804 if (IS_DIGIT (peek_next)
1805 || peek_next == '_'
1806 || IS_UPPER (peek_next))
1808 ret = d_substitution (di, 0);
1809 /* The substituted name may have been a template name and
1810 may be followed by tepmlate args. */
1811 if (d_peek_char (di) == 'I')
1812 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
1813 d_template_args (di));
1814 else
1815 can_subst = 0;
1817 else
1819 ret = d_class_enum_type (di);
1820 /* If the substitution was a complete type, then it is not
1821 a new substitution candidate. However, if the
1822 substitution was followed by template arguments, then
1823 the whole thing is a substitution candidate. */
1824 if (ret != NULL && ret->type == DEMANGLE_COMPONENT_SUB_STD)
1825 can_subst = 0;
1828 break;
1830 case 'P':
1831 d_advance (di, 1);
1832 ret = d_make_comp (di, DEMANGLE_COMPONENT_POINTER,
1833 cplus_demangle_type (di), NULL);
1834 break;
1836 case 'R':
1837 d_advance (di, 1);
1838 ret = d_make_comp (di, DEMANGLE_COMPONENT_REFERENCE,
1839 cplus_demangle_type (di), NULL);
1840 break;
1842 case 'C':
1843 d_advance (di, 1);
1844 ret = d_make_comp (di, DEMANGLE_COMPONENT_COMPLEX,
1845 cplus_demangle_type (di), NULL);
1846 break;
1848 case 'G':
1849 d_advance (di, 1);
1850 ret = d_make_comp (di, DEMANGLE_COMPONENT_IMAGINARY,
1851 cplus_demangle_type (di), NULL);
1852 break;
1854 case 'U':
1855 d_advance (di, 1);
1856 ret = d_source_name (di);
1857 ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL,
1858 cplus_demangle_type (di), ret);
1859 break;
1861 default:
1862 return NULL;
1865 if (can_subst)
1867 if (! d_add_substitution (di, ret))
1868 return NULL;
1871 return ret;
1874 /* <CV-qualifiers> ::= [r] [V] [K] */
1876 static struct demangle_component **
1877 d_cv_qualifiers (struct d_info *di,
1878 struct demangle_component **pret, int member_fn)
1880 char peek;
1882 peek = d_peek_char (di);
1883 while (peek == 'r' || peek == 'V' || peek == 'K')
1885 enum demangle_component_type t;
1887 d_advance (di, 1);
1888 if (peek == 'r')
1890 t = (member_fn
1891 ? DEMANGLE_COMPONENT_RESTRICT_THIS
1892 : DEMANGLE_COMPONENT_RESTRICT);
1893 di->expansion += sizeof "restrict";
1895 else if (peek == 'V')
1897 t = (member_fn
1898 ? DEMANGLE_COMPONENT_VOLATILE_THIS
1899 : DEMANGLE_COMPONENT_VOLATILE);
1900 di->expansion += sizeof "volatile";
1902 else
1904 t = (member_fn
1905 ? DEMANGLE_COMPONENT_CONST_THIS
1906 : DEMANGLE_COMPONENT_CONST);
1907 di->expansion += sizeof "const";
1910 *pret = d_make_comp (di, t, NULL, NULL);
1911 if (*pret == NULL)
1912 return NULL;
1913 pret = &d_left (*pret);
1915 peek = d_peek_char (di);
1918 return pret;
1921 /* <function-type> ::= F [Y] <bare-function-type> E */
1923 static struct demangle_component *
1924 d_function_type (struct d_info *di)
1926 struct demangle_component *ret;
1928 if (d_next_char (di) != 'F')
1929 return NULL;
1930 if (d_peek_char (di) == 'Y')
1932 /* Function has C linkage. We don't print this information.
1933 FIXME: We should print it in verbose mode. */
1934 d_advance (di, 1);
1936 ret = d_bare_function_type (di, 1);
1937 if (d_next_char (di) != 'E')
1938 return NULL;
1939 return ret;
1942 /* <bare-function-type> ::= <type>+ */
1944 static struct demangle_component *
1945 d_bare_function_type (struct d_info *di, int has_return_type)
1947 struct demangle_component *return_type;
1948 struct demangle_component *tl;
1949 struct demangle_component **ptl;
1951 return_type = NULL;
1952 tl = NULL;
1953 ptl = &tl;
1954 while (1)
1956 char peek;
1957 struct demangle_component *type;
1959 peek = d_peek_char (di);
1960 if (peek == '\0' || peek == 'E')
1961 break;
1962 type = cplus_demangle_type (di);
1963 if (type == NULL)
1964 return NULL;
1965 if (has_return_type)
1967 return_type = type;
1968 has_return_type = 0;
1970 else
1972 *ptl = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, type, NULL);
1973 if (*ptl == NULL)
1974 return NULL;
1975 ptl = &d_right (*ptl);
1979 /* There should be at least one parameter type besides the optional
1980 return type. A function which takes no arguments will have a
1981 single parameter type void. */
1982 if (tl == NULL)
1983 return NULL;
1985 /* If we have a single parameter type void, omit it. */
1986 if (d_right (tl) == NULL
1987 && d_left (tl)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
1988 && d_left (tl)->u.s_builtin.type->print == D_PRINT_VOID)
1990 di->expansion -= d_left (tl)->u.s_builtin.type->len;
1991 tl = NULL;
1994 return d_make_comp (di, DEMANGLE_COMPONENT_FUNCTION_TYPE, return_type, tl);
1997 /* <class-enum-type> ::= <name> */
1999 static struct demangle_component *
2000 d_class_enum_type (struct d_info *di)
2002 return d_name (di);
2005 /* <array-type> ::= A <(positive dimension) number> _ <(element) type>
2006 ::= A [<(dimension) expression>] _ <(element) type>
2009 static struct demangle_component *
2010 d_array_type (struct d_info *di)
2012 char peek;
2013 struct demangle_component *dim;
2015 if (d_next_char (di) != 'A')
2016 return NULL;
2018 peek = d_peek_char (di);
2019 if (peek == '_')
2020 dim = NULL;
2021 else if (IS_DIGIT (peek))
2023 const char *s;
2025 s = d_str (di);
2028 d_advance (di, 1);
2029 peek = d_peek_char (di);
2031 while (IS_DIGIT (peek));
2032 dim = d_make_name (di, s, d_str (di) - s);
2033 if (dim == NULL)
2034 return NULL;
2036 else
2038 dim = d_expression (di);
2039 if (dim == NULL)
2040 return NULL;
2043 if (d_next_char (di) != '_')
2044 return NULL;
2046 return d_make_comp (di, DEMANGLE_COMPONENT_ARRAY_TYPE, dim,
2047 cplus_demangle_type (di));
2050 /* <pointer-to-member-type> ::= M <(class) type> <(member) type> */
2052 static struct demangle_component *
2053 d_pointer_to_member_type (struct d_info *di)
2055 struct demangle_component *cl;
2056 struct demangle_component *mem;
2057 struct demangle_component **pmem;
2059 if (d_next_char (di) != 'M')
2060 return NULL;
2062 cl = cplus_demangle_type (di);
2064 /* The ABI specifies that any type can be a substitution source, and
2065 that M is followed by two types, and that when a CV-qualified
2066 type is seen both the base type and the CV-qualified types are
2067 substitution sources. The ABI also specifies that for a pointer
2068 to a CV-qualified member function, the qualifiers are attached to
2069 the second type. Given the grammar, a plain reading of the ABI
2070 suggests that both the CV-qualified member function and the
2071 non-qualified member function are substitution sources. However,
2072 g++ does not work that way. g++ treats only the CV-qualified
2073 member function as a substitution source. FIXME. So to work
2074 with g++, we need to pull off the CV-qualifiers here, in order to
2075 avoid calling add_substitution() in cplus_demangle_type(). */
2077 pmem = d_cv_qualifiers (di, &mem, 1);
2078 if (pmem == NULL)
2079 return NULL;
2080 *pmem = cplus_demangle_type (di);
2082 return d_make_comp (di, DEMANGLE_COMPONENT_PTRMEM_TYPE, cl, mem);
2085 /* <template-param> ::= T_
2086 ::= T <(parameter-2 non-negative) number> _
2089 static struct demangle_component *
2090 d_template_param (struct d_info *di)
2092 long param;
2094 if (d_next_char (di) != 'T')
2095 return NULL;
2097 if (d_peek_char (di) == '_')
2098 param = 0;
2099 else
2101 param = d_number (di);
2102 if (param < 0)
2103 return NULL;
2104 param += 1;
2107 if (d_next_char (di) != '_')
2108 return NULL;
2110 ++di->did_subs;
2112 return d_make_template_param (di, param);
2115 /* <template-args> ::= I <template-arg>+ E */
2117 static struct demangle_component *
2118 d_template_args (struct d_info *di)
2120 struct demangle_component *hold_last_name;
2121 struct demangle_component *al;
2122 struct demangle_component **pal;
2124 /* Preserve the last name we saw--don't let the template arguments
2125 clobber it, as that would give us the wrong name for a subsequent
2126 constructor or destructor. */
2127 hold_last_name = di->last_name;
2129 if (d_next_char (di) != 'I')
2130 return NULL;
2132 al = NULL;
2133 pal = &al;
2134 while (1)
2136 struct demangle_component *a;
2138 a = d_template_arg (di);
2139 if (a == NULL)
2140 return NULL;
2142 *pal = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, a, NULL);
2143 if (*pal == NULL)
2144 return NULL;
2145 pal = &d_right (*pal);
2147 if (d_peek_char (di) == 'E')
2149 d_advance (di, 1);
2150 break;
2154 di->last_name = hold_last_name;
2156 return al;
2159 /* <template-arg> ::= <type>
2160 ::= X <expression> E
2161 ::= <expr-primary>
2164 static struct demangle_component *
2165 d_template_arg (struct d_info *di)
2167 struct demangle_component *ret;
2169 switch (d_peek_char (di))
2171 case 'X':
2172 d_advance (di, 1);
2173 ret = d_expression (di);
2174 if (d_next_char (di) != 'E')
2175 return NULL;
2176 return ret;
2178 case 'L':
2179 return d_expr_primary (di);
2181 default:
2182 return cplus_demangle_type (di);
2186 /* <expression> ::= <(unary) operator-name> <expression>
2187 ::= <(binary) operator-name> <expression> <expression>
2188 ::= <(trinary) operator-name> <expression> <expression> <expression>
2189 ::= st <type>
2190 ::= <template-param>
2191 ::= sr <type> <unqualified-name>
2192 ::= sr <type> <unqualified-name> <template-args>
2193 ::= <expr-primary>
2196 static struct demangle_component *
2197 d_expression (struct d_info *di)
2199 char peek;
2201 peek = d_peek_char (di);
2202 if (peek == 'L')
2203 return d_expr_primary (di);
2204 else if (peek == 'T')
2205 return d_template_param (di);
2206 else if (peek == 's' && d_peek_next_char (di) == 'r')
2208 struct demangle_component *type;
2209 struct demangle_component *name;
2211 d_advance (di, 2);
2212 type = cplus_demangle_type (di);
2213 name = d_unqualified_name (di);
2214 if (d_peek_char (di) != 'I')
2215 return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type, name);
2216 else
2217 return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type,
2218 d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
2219 d_template_args (di)));
2221 else
2223 struct demangle_component *op;
2224 int args;
2226 op = d_operator_name (di);
2227 if (op == NULL)
2228 return NULL;
2230 if (op->type == DEMANGLE_COMPONENT_OPERATOR)
2231 di->expansion += op->u.s_operator.op->len - 2;
2233 if (op->type == DEMANGLE_COMPONENT_OPERATOR
2234 && strcmp (op->u.s_operator.op->code, "st") == 0)
2235 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
2236 cplus_demangle_type (di));
2238 switch (op->type)
2240 default:
2241 return NULL;
2242 case DEMANGLE_COMPONENT_OPERATOR:
2243 args = op->u.s_operator.op->args;
2244 break;
2245 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
2246 args = op->u.s_extended_operator.args;
2247 break;
2248 case DEMANGLE_COMPONENT_CAST:
2249 args = 1;
2250 break;
2253 switch (args)
2255 case 1:
2256 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
2257 d_expression (di));
2258 case 2:
2260 struct demangle_component *left;
2262 left = d_expression (di);
2263 return d_make_comp (di, DEMANGLE_COMPONENT_BINARY, op,
2264 d_make_comp (di,
2265 DEMANGLE_COMPONENT_BINARY_ARGS,
2266 left,
2267 d_expression (di)));
2269 case 3:
2271 struct demangle_component *first;
2272 struct demangle_component *second;
2274 first = d_expression (di);
2275 second = d_expression (di);
2276 return d_make_comp (di, DEMANGLE_COMPONENT_TRINARY, op,
2277 d_make_comp (di,
2278 DEMANGLE_COMPONENT_TRINARY_ARG1,
2279 first,
2280 d_make_comp (di,
2281 DEMANGLE_COMPONENT_TRINARY_ARG2,
2282 second,
2283 d_expression (di))));
2285 default:
2286 return NULL;
2291 /* <expr-primary> ::= L <type> <(value) number> E
2292 ::= L <type> <(value) float> E
2293 ::= L <mangled-name> E
2296 static struct demangle_component *
2297 d_expr_primary (struct d_info *di)
2299 struct demangle_component *ret;
2301 if (d_next_char (di) != 'L')
2302 return NULL;
2303 if (d_peek_char (di) == '_')
2304 ret = cplus_demangle_mangled_name (di, 0);
2305 else
2307 struct demangle_component *type;
2308 enum demangle_component_type t;
2309 const char *s;
2311 type = cplus_demangle_type (di);
2312 if (type == NULL)
2313 return NULL;
2315 /* If we have a type we know how to print, we aren't going to
2316 print the type name itself. */
2317 if (type->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
2318 && type->u.s_builtin.type->print != D_PRINT_DEFAULT)
2319 di->expansion -= type->u.s_builtin.type->len;
2321 /* Rather than try to interpret the literal value, we just
2322 collect it as a string. Note that it's possible to have a
2323 floating point literal here. The ABI specifies that the
2324 format of such literals is machine independent. That's fine,
2325 but what's not fine is that versions of g++ up to 3.2 with
2326 -fabi-version=1 used upper case letters in the hex constant,
2327 and dumped out gcc's internal representation. That makes it
2328 hard to tell where the constant ends, and hard to dump the
2329 constant in any readable form anyhow. We don't attempt to
2330 handle these cases. */
2332 t = DEMANGLE_COMPONENT_LITERAL;
2333 if (d_peek_char (di) == 'n')
2335 t = DEMANGLE_COMPONENT_LITERAL_NEG;
2336 d_advance (di, 1);
2338 s = d_str (di);
2339 while (d_peek_char (di) != 'E')
2340 d_advance (di, 1);
2341 ret = d_make_comp (di, t, type, d_make_name (di, s, d_str (di) - s));
2343 if (d_next_char (di) != 'E')
2344 return NULL;
2345 return ret;
2348 /* <local-name> ::= Z <(function) encoding> E <(entity) name> [<discriminator>]
2349 ::= Z <(function) encoding> E s [<discriminator>]
2352 static struct demangle_component *
2353 d_local_name (struct d_info *di)
2355 struct demangle_component *function;
2357 if (d_next_char (di) != 'Z')
2358 return NULL;
2360 function = d_encoding (di, 0);
2362 if (d_next_char (di) != 'E')
2363 return NULL;
2365 if (d_peek_char (di) == 's')
2367 d_advance (di, 1);
2368 if (! d_discriminator (di))
2369 return NULL;
2370 return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function,
2371 d_make_name (di, "string literal",
2372 sizeof "string literal" - 1));
2374 else
2376 struct demangle_component *name;
2378 name = d_name (di);
2379 if (! d_discriminator (di))
2380 return NULL;
2381 return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function, name);
2385 /* <discriminator> ::= _ <(non-negative) number>
2387 We demangle the discriminator, but we don't print it out. FIXME:
2388 We should print it out in verbose mode. */
2390 static int
2391 d_discriminator (struct d_info *di)
2393 long discrim;
2395 if (d_peek_char (di) != '_')
2396 return 1;
2397 d_advance (di, 1);
2398 discrim = d_number (di);
2399 if (discrim < 0)
2400 return 0;
2401 return 1;
2404 /* Add a new substitution. */
2406 static int
2407 d_add_substitution (struct d_info *di, struct demangle_component *dc)
2409 if (dc == NULL)
2410 return 0;
2411 if (di->next_sub >= di->num_subs)
2412 return 0;
2413 di->subs[di->next_sub] = dc;
2414 ++di->next_sub;
2415 return 1;
2418 /* <substitution> ::= S <seq-id> _
2419 ::= S_
2420 ::= St
2421 ::= Sa
2422 ::= Sb
2423 ::= Ss
2424 ::= Si
2425 ::= So
2426 ::= Sd
2428 If PREFIX is non-zero, then this type is being used as a prefix in
2429 a qualified name. In this case, for the standard substitutions, we
2430 need to check whether we are being used as a prefix for a
2431 constructor or destructor, and return a full template name.
2432 Otherwise we will get something like std::iostream::~iostream()
2433 which does not correspond particularly well to any function which
2434 actually appears in the source.
2437 static const struct d_standard_sub_info standard_subs[] =
2439 { 't', NL ("std"),
2440 NL ("std"),
2441 NULL, 0 },
2442 { 'a', NL ("std::allocator"),
2443 NL ("std::allocator"),
2444 NL ("allocator") },
2445 { 'b', NL ("std::basic_string"),
2446 NL ("std::basic_string"),
2447 NL ("basic_string") },
2448 { 's', NL ("std::string"),
2449 NL ("std::basic_string<char, std::char_traits<char>, std::allocator<char> >"),
2450 NL ("basic_string") },
2451 { 'i', NL ("std::istream"),
2452 NL ("std::basic_istream<char, std::char_traits<char> >"),
2453 NL ("basic_istream") },
2454 { 'o', NL ("std::ostream"),
2455 NL ("std::basic_ostream<char, std::char_traits<char> >"),
2456 NL ("basic_ostream") },
2457 { 'd', NL ("std::iostream"),
2458 NL ("std::basic_iostream<char, std::char_traits<char> >"),
2459 NL ("basic_iostream") }
2462 static struct demangle_component *
2463 d_substitution (struct d_info *di, int prefix)
2465 char c;
2467 if (d_next_char (di) != 'S')
2468 return NULL;
2470 c = d_next_char (di);
2471 if (c == '_' || IS_DIGIT (c) || IS_UPPER (c))
2473 int id;
2475 id = 0;
2476 if (c != '_')
2480 if (IS_DIGIT (c))
2481 id = id * 36 + c - '0';
2482 else if (IS_UPPER (c))
2483 id = id * 36 + c - 'A' + 10;
2484 else
2485 return NULL;
2486 c = d_next_char (di);
2488 while (c != '_');
2490 ++id;
2493 if (id >= di->next_sub)
2494 return NULL;
2496 ++di->did_subs;
2498 return di->subs[id];
2500 else
2502 int verbose;
2503 const struct d_standard_sub_info *p;
2504 const struct d_standard_sub_info *pend;
2506 verbose = (di->options & DMGL_VERBOSE) != 0;
2507 if (! verbose && prefix)
2509 char peek;
2511 peek = d_peek_char (di);
2512 if (peek == 'C' || peek == 'D')
2513 verbose = 1;
2516 pend = (&standard_subs[0]
2517 + sizeof standard_subs / sizeof standard_subs[0]);
2518 for (p = &standard_subs[0]; p < pend; ++p)
2520 if (c == p->code)
2522 const char *s;
2523 int len;
2525 if (p->set_last_name != NULL)
2526 di->last_name = d_make_sub (di, p->set_last_name,
2527 p->set_last_name_len);
2528 if (verbose)
2530 s = p->full_expansion;
2531 len = p->full_len;
2533 else
2535 s = p->simple_expansion;
2536 len = p->simple_len;
2538 di->expansion += len;
2539 return d_make_sub (di, s, len);
2543 return NULL;
2547 /* Resize the print buffer. */
2549 static void
2550 d_print_resize (struct d_print_info *dpi, size_t add)
2552 size_t need;
2554 if (dpi->buf == NULL)
2555 return;
2556 need = dpi->len + add;
2557 while (need > dpi->alc)
2559 size_t newalc;
2560 char *newbuf;
2562 newalc = dpi->alc * 2;
2563 newbuf = (char *) realloc (dpi->buf, newalc);
2564 if (newbuf == NULL)
2566 free (dpi->buf);
2567 dpi->buf = NULL;
2568 dpi->allocation_failure = 1;
2569 return;
2571 dpi->buf = newbuf;
2572 dpi->alc = newalc;
2576 /* Append a character to the print buffer. */
2578 static void
2579 d_print_append_char (struct d_print_info *dpi, int c)
2581 if (dpi->buf != NULL)
2583 if (dpi->len >= dpi->alc)
2585 d_print_resize (dpi, 1);
2586 if (dpi->buf == NULL)
2587 return;
2590 dpi->buf[dpi->len] = c;
2591 ++dpi->len;
2595 /* Append a buffer to the print buffer. */
2597 static void
2598 d_print_append_buffer (struct d_print_info *dpi, const char *s, size_t l)
2600 if (dpi->buf != NULL)
2602 if (dpi->len + l > dpi->alc)
2604 d_print_resize (dpi, l);
2605 if (dpi->buf == NULL)
2606 return;
2609 memcpy (dpi->buf + dpi->len, s, l);
2610 dpi->len += l;
2614 /* Indicate that an error occurred during printing. */
2616 static void
2617 d_print_error (struct d_print_info *dpi)
2619 free (dpi->buf);
2620 dpi->buf = NULL;
2623 /* Turn components into a human readable string. OPTIONS is the
2624 options bits passed to the demangler. DC is the tree to print.
2625 ESTIMATE is a guess at the length of the result. This returns a
2626 string allocated by malloc, or NULL on error. On success, this
2627 sets *PALC to the size of the allocated buffer. On failure, this
2628 sets *PALC to 0 for a bad parse, or to 1 for a memory allocation
2629 failure. */
2631 CP_STATIC_IF_GLIBCPP_V3
2632 char *
2633 cplus_demangle_print (int options, const struct demangle_component *dc,
2634 int estimate, size_t *palc)
2636 struct d_print_info dpi;
2638 dpi.options = options;
2640 dpi.alc = estimate + 1;
2641 dpi.buf = (char *) malloc (dpi.alc);
2642 if (dpi.buf == NULL)
2644 *palc = 1;
2645 return NULL;
2648 dpi.len = 0;
2649 dpi.templates = NULL;
2650 dpi.modifiers = NULL;
2652 dpi.allocation_failure = 0;
2654 d_print_comp (&dpi, dc);
2656 d_append_char (&dpi, '\0');
2658 if (dpi.buf != NULL)
2659 *palc = dpi.alc;
2660 else
2661 *palc = dpi.allocation_failure;
2663 return dpi.buf;
2666 /* Subroutine to handle components. */
2668 static void
2669 d_print_comp (struct d_print_info *dpi,
2670 const struct demangle_component *dc)
2672 if (dc == NULL)
2674 d_print_error (dpi);
2675 return;
2677 if (d_print_saw_error (dpi))
2678 return;
2680 switch (dc->type)
2682 case DEMANGLE_COMPONENT_NAME:
2683 if ((dpi->options & DMGL_JAVA) == 0)
2684 d_append_buffer (dpi, dc->u.s_name.s, dc->u.s_name.len);
2685 else
2686 d_print_java_identifier (dpi, dc->u.s_name.s, dc->u.s_name.len);
2687 return;
2689 case DEMANGLE_COMPONENT_QUAL_NAME:
2690 case DEMANGLE_COMPONENT_LOCAL_NAME:
2691 d_print_comp (dpi, d_left (dc));
2692 if ((dpi->options & DMGL_JAVA) == 0)
2693 d_append_string_constant (dpi, "::");
2694 else
2695 d_append_char (dpi, '.');
2696 d_print_comp (dpi, d_right (dc));
2697 return;
2699 case DEMANGLE_COMPONENT_TYPED_NAME:
2701 struct d_print_mod *hold_modifiers;
2702 struct demangle_component *typed_name;
2703 struct d_print_mod adpm[4];
2704 unsigned int i;
2705 struct d_print_template dpt;
2707 /* Pass the name down to the type so that it can be printed in
2708 the right place for the type. We also have to pass down
2709 any CV-qualifiers, which apply to the this parameter. */
2710 hold_modifiers = dpi->modifiers;
2711 i = 0;
2712 typed_name = d_left (dc);
2713 while (typed_name != NULL)
2715 if (i >= sizeof adpm / sizeof adpm[0])
2717 d_print_error (dpi);
2718 return;
2721 adpm[i].next = dpi->modifiers;
2722 dpi->modifiers = &adpm[i];
2723 adpm[i].mod = typed_name;
2724 adpm[i].printed = 0;
2725 adpm[i].templates = dpi->templates;
2726 ++i;
2728 if (typed_name->type != DEMANGLE_COMPONENT_RESTRICT_THIS
2729 && typed_name->type != DEMANGLE_COMPONENT_VOLATILE_THIS
2730 && typed_name->type != DEMANGLE_COMPONENT_CONST_THIS)
2731 break;
2733 typed_name = d_left (typed_name);
2736 /* If typed_name is a template, then it applies to the
2737 function type as well. */
2738 if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
2740 dpt.next = dpi->templates;
2741 dpi->templates = &dpt;
2742 dpt.template_decl = typed_name;
2745 /* If typed_name is a DEMANGLE_COMPONENT_LOCAL_NAME, then
2746 there may be CV-qualifiers on its right argument which
2747 really apply here; this happens when parsing a class which
2748 is local to a function. */
2749 if (typed_name->type == DEMANGLE_COMPONENT_LOCAL_NAME)
2751 struct demangle_component *local_name;
2753 local_name = d_right (typed_name);
2754 while (local_name->type == DEMANGLE_COMPONENT_RESTRICT_THIS
2755 || local_name->type == DEMANGLE_COMPONENT_VOLATILE_THIS
2756 || local_name->type == DEMANGLE_COMPONENT_CONST_THIS)
2758 if (i >= sizeof adpm / sizeof adpm[0])
2760 d_print_error (dpi);
2761 return;
2764 adpm[i] = adpm[i - 1];
2765 adpm[i].next = &adpm[i - 1];
2766 dpi->modifiers = &adpm[i];
2768 adpm[i - 1].mod = local_name;
2769 adpm[i - 1].printed = 0;
2770 adpm[i - 1].templates = dpi->templates;
2771 ++i;
2773 local_name = d_left (local_name);
2777 d_print_comp (dpi, d_right (dc));
2779 if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
2780 dpi->templates = dpt.next;
2782 /* If the modifiers didn't get printed by the type, print them
2783 now. */
2784 while (i > 0)
2786 --i;
2787 if (! adpm[i].printed)
2789 d_append_char (dpi, ' ');
2790 d_print_mod (dpi, adpm[i].mod);
2794 dpi->modifiers = hold_modifiers;
2796 return;
2799 case DEMANGLE_COMPONENT_TEMPLATE:
2801 struct d_print_mod *hold_dpm;
2803 /* Don't push modifiers into a template definition. Doing so
2804 could give the wrong definition for a template argument.
2805 Instead, treat the template essentially as a name. */
2807 hold_dpm = dpi->modifiers;
2808 dpi->modifiers = NULL;
2810 d_print_comp (dpi, d_left (dc));
2811 if (d_last_char (dpi) == '<')
2812 d_append_char (dpi, ' ');
2813 d_append_char (dpi, '<');
2814 d_print_comp (dpi, d_right (dc));
2815 /* Avoid generating two consecutive '>' characters, to avoid
2816 the C++ syntactic ambiguity. */
2817 if (d_last_char (dpi) == '>')
2818 d_append_char (dpi, ' ');
2819 d_append_char (dpi, '>');
2821 dpi->modifiers = hold_dpm;
2823 return;
2826 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
2828 long i;
2829 struct demangle_component *a;
2830 struct d_print_template *hold_dpt;
2832 if (dpi->templates == NULL)
2834 d_print_error (dpi);
2835 return;
2837 i = dc->u.s_number.number;
2838 for (a = d_right (dpi->templates->template_decl);
2839 a != NULL;
2840 a = d_right (a))
2842 if (a->type != DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
2844 d_print_error (dpi);
2845 return;
2847 if (i <= 0)
2848 break;
2849 --i;
2851 if (i != 0 || a == NULL)
2853 d_print_error (dpi);
2854 return;
2857 /* While processing this parameter, we need to pop the list of
2858 templates. This is because the template parameter may
2859 itself be a reference to a parameter of an outer
2860 template. */
2862 hold_dpt = dpi->templates;
2863 dpi->templates = hold_dpt->next;
2865 d_print_comp (dpi, d_left (a));
2867 dpi->templates = hold_dpt;
2869 return;
2872 case DEMANGLE_COMPONENT_CTOR:
2873 d_print_comp (dpi, dc->u.s_ctor.name);
2874 return;
2876 case DEMANGLE_COMPONENT_DTOR:
2877 d_append_char (dpi, '~');
2878 d_print_comp (dpi, dc->u.s_dtor.name);
2879 return;
2881 case DEMANGLE_COMPONENT_VTABLE:
2882 d_append_string_constant (dpi, "vtable for ");
2883 d_print_comp (dpi, d_left (dc));
2884 return;
2886 case DEMANGLE_COMPONENT_VTT:
2887 d_append_string_constant (dpi, "VTT for ");
2888 d_print_comp (dpi, d_left (dc));
2889 return;
2891 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
2892 d_append_string_constant (dpi, "construction vtable for ");
2893 d_print_comp (dpi, d_left (dc));
2894 d_append_string_constant (dpi, "-in-");
2895 d_print_comp (dpi, d_right (dc));
2896 return;
2898 case DEMANGLE_COMPONENT_TYPEINFO:
2899 d_append_string_constant (dpi, "typeinfo for ");
2900 d_print_comp (dpi, d_left (dc));
2901 return;
2903 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
2904 d_append_string_constant (dpi, "typeinfo name for ");
2905 d_print_comp (dpi, d_left (dc));
2906 return;
2908 case DEMANGLE_COMPONENT_TYPEINFO_FN:
2909 d_append_string_constant (dpi, "typeinfo fn for ");
2910 d_print_comp (dpi, d_left (dc));
2911 return;
2913 case DEMANGLE_COMPONENT_THUNK:
2914 d_append_string_constant (dpi, "non-virtual thunk to ");
2915 d_print_comp (dpi, d_left (dc));
2916 return;
2918 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
2919 d_append_string_constant (dpi, "virtual thunk to ");
2920 d_print_comp (dpi, d_left (dc));
2921 return;
2923 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
2924 d_append_string_constant (dpi, "covariant return thunk to ");
2925 d_print_comp (dpi, d_left (dc));
2926 return;
2928 case DEMANGLE_COMPONENT_JAVA_CLASS:
2929 d_append_string_constant (dpi, "java Class for ");
2930 d_print_comp (dpi, d_left (dc));
2931 return;
2933 case DEMANGLE_COMPONENT_GUARD:
2934 d_append_string_constant (dpi, "guard variable for ");
2935 d_print_comp (dpi, d_left (dc));
2936 return;
2938 case DEMANGLE_COMPONENT_REFTEMP:
2939 d_append_string_constant (dpi, "reference temporary for ");
2940 d_print_comp (dpi, d_left (dc));
2941 return;
2943 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
2944 d_append_string_constant (dpi, "hidden alias for ");
2945 d_print_comp (dpi, d_left (dc));
2946 return;
2948 case DEMANGLE_COMPONENT_SUB_STD:
2949 d_append_buffer (dpi, dc->u.s_string.string, dc->u.s_string.len);
2950 return;
2952 case DEMANGLE_COMPONENT_RESTRICT:
2953 case DEMANGLE_COMPONENT_VOLATILE:
2954 case DEMANGLE_COMPONENT_CONST:
2956 struct d_print_mod *pdpm;
2958 /* When printing arrays, it's possible to have cases where the
2959 same CV-qualifier gets pushed on the stack multiple times.
2960 We only need to print it once. */
2962 for (pdpm = dpi->modifiers; pdpm != NULL; pdpm = pdpm->next)
2964 if (! pdpm->printed)
2966 if (pdpm->mod->type != DEMANGLE_COMPONENT_RESTRICT
2967 && pdpm->mod->type != DEMANGLE_COMPONENT_VOLATILE
2968 && pdpm->mod->type != DEMANGLE_COMPONENT_CONST)
2969 break;
2970 if (pdpm->mod->type == dc->type)
2972 d_print_comp (dpi, d_left (dc));
2973 return;
2978 /* Fall through. */
2979 case DEMANGLE_COMPONENT_RESTRICT_THIS:
2980 case DEMANGLE_COMPONENT_VOLATILE_THIS:
2981 case DEMANGLE_COMPONENT_CONST_THIS:
2982 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
2983 case DEMANGLE_COMPONENT_POINTER:
2984 case DEMANGLE_COMPONENT_REFERENCE:
2985 case DEMANGLE_COMPONENT_COMPLEX:
2986 case DEMANGLE_COMPONENT_IMAGINARY:
2988 /* We keep a list of modifiers on the stack. */
2989 struct d_print_mod dpm;
2991 dpm.next = dpi->modifiers;
2992 dpi->modifiers = &dpm;
2993 dpm.mod = dc;
2994 dpm.printed = 0;
2995 dpm.templates = dpi->templates;
2997 d_print_comp (dpi, d_left (dc));
2999 /* If the modifier didn't get printed by the type, print it
3000 now. */
3001 if (! dpm.printed)
3002 d_print_mod (dpi, dc);
3004 dpi->modifiers = dpm.next;
3006 return;
3009 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
3010 if ((dpi->options & DMGL_JAVA) == 0)
3011 d_append_buffer (dpi, dc->u.s_builtin.type->name,
3012 dc->u.s_builtin.type->len);
3013 else
3014 d_append_buffer (dpi, dc->u.s_builtin.type->java_name,
3015 dc->u.s_builtin.type->java_len);
3016 return;
3018 case DEMANGLE_COMPONENT_VENDOR_TYPE:
3019 d_print_comp (dpi, d_left (dc));
3020 return;
3022 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
3024 if (d_left (dc) != NULL)
3026 struct d_print_mod dpm;
3028 /* We must pass this type down as a modifier in order to
3029 print it in the right location. */
3031 dpm.next = dpi->modifiers;
3032 dpi->modifiers = &dpm;
3033 dpm.mod = dc;
3034 dpm.printed = 0;
3035 dpm.templates = dpi->templates;
3037 d_print_comp (dpi, d_left (dc));
3039 dpi->modifiers = dpm.next;
3041 if (dpm.printed)
3042 return;
3044 d_append_char (dpi, ' ');
3047 d_print_function_type (dpi, dc, dpi->modifiers);
3049 return;
3052 case DEMANGLE_COMPONENT_ARRAY_TYPE:
3054 struct d_print_mod *hold_modifiers;
3055 struct d_print_mod adpm[4];
3056 unsigned int i;
3057 struct d_print_mod *pdpm;
3059 /* We must pass this type down as a modifier in order to print
3060 multi-dimensional arrays correctly. If the array itself is
3061 CV-qualified, we act as though the element type were
3062 CV-qualified. We do this by copying the modifiers down
3063 rather than fiddling pointers, so that we don't wind up
3064 with a d_print_mod higher on the stack pointing into our
3065 stack frame after we return. */
3067 hold_modifiers = dpi->modifiers;
3069 adpm[0].next = hold_modifiers;
3070 dpi->modifiers = &adpm[0];
3071 adpm[0].mod = dc;
3072 adpm[0].printed = 0;
3073 adpm[0].templates = dpi->templates;
3075 i = 1;
3076 pdpm = hold_modifiers;
3077 while (pdpm != NULL
3078 && (pdpm->mod->type == DEMANGLE_COMPONENT_RESTRICT
3079 || pdpm->mod->type == DEMANGLE_COMPONENT_VOLATILE
3080 || pdpm->mod->type == DEMANGLE_COMPONENT_CONST))
3082 if (! pdpm->printed)
3084 if (i >= sizeof adpm / sizeof adpm[0])
3086 d_print_error (dpi);
3087 return;
3090 adpm[i] = *pdpm;
3091 adpm[i].next = dpi->modifiers;
3092 dpi->modifiers = &adpm[i];
3093 pdpm->printed = 1;
3094 ++i;
3097 pdpm = pdpm->next;
3100 d_print_comp (dpi, d_right (dc));
3102 dpi->modifiers = hold_modifiers;
3104 if (adpm[0].printed)
3105 return;
3107 while (i > 1)
3109 --i;
3110 d_print_mod (dpi, adpm[i].mod);
3113 d_print_array_type (dpi, dc, dpi->modifiers);
3115 return;
3118 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
3120 struct d_print_mod dpm;
3122 dpm.next = dpi->modifiers;
3123 dpi->modifiers = &dpm;
3124 dpm.mod = dc;
3125 dpm.printed = 0;
3126 dpm.templates = dpi->templates;
3128 d_print_comp (dpi, d_right (dc));
3130 /* If the modifier didn't get printed by the type, print it
3131 now. */
3132 if (! dpm.printed)
3134 d_append_char (dpi, ' ');
3135 d_print_comp (dpi, d_left (dc));
3136 d_append_string_constant (dpi, "::*");
3139 dpi->modifiers = dpm.next;
3141 return;
3144 case DEMANGLE_COMPONENT_ARGLIST:
3145 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
3146 d_print_comp (dpi, d_left (dc));
3147 if (d_right (dc) != NULL)
3149 d_append_string_constant (dpi, ", ");
3150 d_print_comp (dpi, d_right (dc));
3152 return;
3154 case DEMANGLE_COMPONENT_OPERATOR:
3156 char c;
3158 d_append_string_constant (dpi, "operator");
3159 c = dc->u.s_operator.op->name[0];
3160 if (IS_LOWER (c))
3161 d_append_char (dpi, ' ');
3162 d_append_buffer (dpi, dc->u.s_operator.op->name,
3163 dc->u.s_operator.op->len);
3164 return;
3167 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
3168 d_append_string_constant (dpi, "operator ");
3169 d_print_comp (dpi, dc->u.s_extended_operator.name);
3170 return;
3172 case DEMANGLE_COMPONENT_CAST:
3173 d_append_string_constant (dpi, "operator ");
3174 d_print_cast (dpi, dc);
3175 return;
3177 case DEMANGLE_COMPONENT_UNARY:
3178 if (d_left (dc)->type != DEMANGLE_COMPONENT_CAST)
3179 d_print_expr_op (dpi, d_left (dc));
3180 else
3182 d_append_char (dpi, '(');
3183 d_print_cast (dpi, d_left (dc));
3184 d_append_char (dpi, ')');
3186 d_append_char (dpi, '(');
3187 d_print_comp (dpi, d_right (dc));
3188 d_append_char (dpi, ')');
3189 return;
3191 case DEMANGLE_COMPONENT_BINARY:
3192 if (d_right (dc)->type != DEMANGLE_COMPONENT_BINARY_ARGS)
3194 d_print_error (dpi);
3195 return;
3198 /* We wrap an expression which uses the greater-than operator in
3199 an extra layer of parens so that it does not get confused
3200 with the '>' which ends the template parameters. */
3201 if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
3202 && d_left (dc)->u.s_operator.op->len == 1
3203 && d_left (dc)->u.s_operator.op->name[0] == '>')
3204 d_append_char (dpi, '(');
3206 d_append_char (dpi, '(');
3207 d_print_comp (dpi, d_left (d_right (dc)));
3208 d_append_string_constant (dpi, ") ");
3209 d_print_expr_op (dpi, d_left (dc));
3210 d_append_string_constant (dpi, " (");
3211 d_print_comp (dpi, d_right (d_right (dc)));
3212 d_append_char (dpi, ')');
3214 if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
3215 && d_left (dc)->u.s_operator.op->len == 1
3216 && d_left (dc)->u.s_operator.op->name[0] == '>')
3217 d_append_char (dpi, ')');
3219 return;
3221 case DEMANGLE_COMPONENT_BINARY_ARGS:
3222 /* We should only see this as part of DEMANGLE_COMPONENT_BINARY. */
3223 d_print_error (dpi);
3224 return;
3226 case DEMANGLE_COMPONENT_TRINARY:
3227 if (d_right (dc)->type != DEMANGLE_COMPONENT_TRINARY_ARG1
3228 || d_right (d_right (dc))->type != DEMANGLE_COMPONENT_TRINARY_ARG2)
3230 d_print_error (dpi);
3231 return;
3233 d_append_char (dpi, '(');
3234 d_print_comp (dpi, d_left (d_right (dc)));
3235 d_append_string_constant (dpi, ") ");
3236 d_print_expr_op (dpi, d_left (dc));
3237 d_append_string_constant (dpi, " (");
3238 d_print_comp (dpi, d_left (d_right (d_right (dc))));
3239 d_append_string_constant (dpi, ") : (");
3240 d_print_comp (dpi, d_right (d_right (d_right (dc))));
3241 d_append_char (dpi, ')');
3242 return;
3244 case DEMANGLE_COMPONENT_TRINARY_ARG1:
3245 case DEMANGLE_COMPONENT_TRINARY_ARG2:
3246 /* We should only see these are part of DEMANGLE_COMPONENT_TRINARY. */
3247 d_print_error (dpi);
3248 return;
3250 case DEMANGLE_COMPONENT_LITERAL:
3251 case DEMANGLE_COMPONENT_LITERAL_NEG:
3253 enum d_builtin_type_print tp;
3255 /* For some builtin types, produce simpler output. */
3256 tp = D_PRINT_DEFAULT;
3257 if (d_left (dc)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE)
3259 tp = d_left (dc)->u.s_builtin.type->print;
3260 switch (tp)
3262 case D_PRINT_INT:
3263 case D_PRINT_UNSIGNED:
3264 case D_PRINT_LONG:
3265 case D_PRINT_UNSIGNED_LONG:
3266 case D_PRINT_LONG_LONG:
3267 case D_PRINT_UNSIGNED_LONG_LONG:
3268 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME)
3270 if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
3271 d_append_char (dpi, '-');
3272 d_print_comp (dpi, d_right (dc));
3273 switch (tp)
3275 default:
3276 break;
3277 case D_PRINT_UNSIGNED:
3278 d_append_char (dpi, 'u');
3279 break;
3280 case D_PRINT_LONG:
3281 d_append_char (dpi, 'l');
3282 break;
3283 case D_PRINT_UNSIGNED_LONG:
3284 d_append_string_constant (dpi, "ul");
3285 break;
3286 case D_PRINT_LONG_LONG:
3287 d_append_string_constant (dpi, "ll");
3288 break;
3289 case D_PRINT_UNSIGNED_LONG_LONG:
3290 d_append_string_constant (dpi, "ull");
3291 break;
3293 return;
3295 break;
3297 case D_PRINT_BOOL:
3298 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME
3299 && d_right (dc)->u.s_name.len == 1
3300 && dc->type == DEMANGLE_COMPONENT_LITERAL)
3302 switch (d_right (dc)->u.s_name.s[0])
3304 case '0':
3305 d_append_string_constant (dpi, "false");
3306 return;
3307 case '1':
3308 d_append_string_constant (dpi, "true");
3309 return;
3310 default:
3311 break;
3314 break;
3316 default:
3317 break;
3321 d_append_char (dpi, '(');
3322 d_print_comp (dpi, d_left (dc));
3323 d_append_char (dpi, ')');
3324 if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
3325 d_append_char (dpi, '-');
3326 if (tp == D_PRINT_FLOAT)
3327 d_append_char (dpi, '[');
3328 d_print_comp (dpi, d_right (dc));
3329 if (tp == D_PRINT_FLOAT)
3330 d_append_char (dpi, ']');
3332 return;
3334 default:
3335 d_print_error (dpi);
3336 return;
3340 /* Print a Java dentifier. For Java we try to handle encoded extended
3341 Unicode characters. The C++ ABI doesn't mention Unicode encoding,
3342 so we don't it for C++. Characters are encoded as
3343 __U<hex-char>+_. */
3345 static void
3346 d_print_java_identifier (struct d_print_info *dpi, const char *name, int len)
3348 const char *p;
3349 const char *end;
3351 end = name + len;
3352 for (p = name; p < end; ++p)
3354 if (end - p > 3
3355 && p[0] == '_'
3356 && p[1] == '_'
3357 && p[2] == 'U')
3359 unsigned long c;
3360 const char *q;
3362 c = 0;
3363 for (q = p + 3; q < end; ++q)
3365 int dig;
3367 if (IS_DIGIT (*q))
3368 dig = *q - '0';
3369 else if (*q >= 'A' && *q <= 'F')
3370 dig = *q - 'A' + 10;
3371 else if (*q >= 'a' && *q <= 'f')
3372 dig = *q - 'a' + 10;
3373 else
3374 break;
3376 c = c * 16 + dig;
3378 /* If the Unicode character is larger than 256, we don't try
3379 to deal with it here. FIXME. */
3380 if (q < end && *q == '_' && c < 256)
3382 d_append_char (dpi, c);
3383 p = q;
3384 continue;
3388 d_append_char (dpi, *p);
3392 /* Print a list of modifiers. SUFFIX is 1 if we are printing
3393 qualifiers on this after printing a function. */
3395 static void
3396 d_print_mod_list (struct d_print_info *dpi,
3397 struct d_print_mod *mods, int suffix)
3399 struct d_print_template *hold_dpt;
3401 if (mods == NULL || d_print_saw_error (dpi))
3402 return;
3404 if (mods->printed
3405 || (! suffix
3406 && (mods->mod->type == DEMANGLE_COMPONENT_RESTRICT_THIS
3407 || mods->mod->type == DEMANGLE_COMPONENT_VOLATILE_THIS
3408 || mods->mod->type == DEMANGLE_COMPONENT_CONST_THIS)))
3410 d_print_mod_list (dpi, mods->next, suffix);
3411 return;
3414 mods->printed = 1;
3416 hold_dpt = dpi->templates;
3417 dpi->templates = mods->templates;
3419 if (mods->mod->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
3421 d_print_function_type (dpi, mods->mod, mods->next);
3422 dpi->templates = hold_dpt;
3423 return;
3425 else if (mods->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
3427 d_print_array_type (dpi, mods->mod, mods->next);
3428 dpi->templates = hold_dpt;
3429 return;
3431 else if (mods->mod->type == DEMANGLE_COMPONENT_LOCAL_NAME)
3433 struct d_print_mod *hold_modifiers;
3434 struct demangle_component *dc;
3436 /* When this is on the modifier stack, we have pulled any
3437 qualifiers off the right argument already. Otherwise, we
3438 print it as usual, but don't let the left argument see any
3439 modifiers. */
3441 hold_modifiers = dpi->modifiers;
3442 dpi->modifiers = NULL;
3443 d_print_comp (dpi, d_left (mods->mod));
3444 dpi->modifiers = hold_modifiers;
3446 if ((dpi->options & DMGL_JAVA) == 0)
3447 d_append_string_constant (dpi, "::");
3448 else
3449 d_append_char (dpi, '.');
3451 dc = d_right (mods->mod);
3452 while (dc->type == DEMANGLE_COMPONENT_RESTRICT_THIS
3453 || dc->type == DEMANGLE_COMPONENT_VOLATILE_THIS
3454 || dc->type == DEMANGLE_COMPONENT_CONST_THIS)
3455 dc = d_left (dc);
3457 d_print_comp (dpi, dc);
3459 dpi->templates = hold_dpt;
3460 return;
3463 d_print_mod (dpi, mods->mod);
3465 dpi->templates = hold_dpt;
3467 d_print_mod_list (dpi, mods->next, suffix);
3470 /* Print a modifier. */
3472 static void
3473 d_print_mod (struct d_print_info *dpi,
3474 const struct demangle_component *mod)
3476 switch (mod->type)
3478 case DEMANGLE_COMPONENT_RESTRICT:
3479 case DEMANGLE_COMPONENT_RESTRICT_THIS:
3480 d_append_string_constant (dpi, " restrict");
3481 return;
3482 case DEMANGLE_COMPONENT_VOLATILE:
3483 case DEMANGLE_COMPONENT_VOLATILE_THIS:
3484 d_append_string_constant (dpi, " volatile");
3485 return;
3486 case DEMANGLE_COMPONENT_CONST:
3487 case DEMANGLE_COMPONENT_CONST_THIS:
3488 d_append_string_constant (dpi, " const");
3489 return;
3490 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
3491 d_append_char (dpi, ' ');
3492 d_print_comp (dpi, d_right (mod));
3493 return;
3494 case DEMANGLE_COMPONENT_POINTER:
3495 /* There is no pointer symbol in Java. */
3496 if ((dpi->options & DMGL_JAVA) == 0)
3497 d_append_char (dpi, '*');
3498 return;
3499 case DEMANGLE_COMPONENT_REFERENCE:
3500 d_append_char (dpi, '&');
3501 return;
3502 case DEMANGLE_COMPONENT_COMPLEX:
3503 d_append_string_constant (dpi, "complex ");
3504 return;
3505 case DEMANGLE_COMPONENT_IMAGINARY:
3506 d_append_string_constant (dpi, "imaginary ");
3507 return;
3508 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
3509 if (d_last_char (dpi) != '(')
3510 d_append_char (dpi, ' ');
3511 d_print_comp (dpi, d_left (mod));
3512 d_append_string_constant (dpi, "::*");
3513 return;
3514 case DEMANGLE_COMPONENT_TYPED_NAME:
3515 d_print_comp (dpi, d_left (mod));
3516 return;
3517 default:
3518 /* Otherwise, we have something that won't go back on the
3519 modifier stack, so we can just print it. */
3520 d_print_comp (dpi, mod);
3521 return;
3525 /* Print a function type, except for the return type. */
3527 static void
3528 d_print_function_type (struct d_print_info *dpi,
3529 const struct demangle_component *dc,
3530 struct d_print_mod *mods)
3532 int need_paren;
3533 int saw_mod;
3534 int need_space;
3535 struct d_print_mod *p;
3536 struct d_print_mod *hold_modifiers;
3538 need_paren = 0;
3539 saw_mod = 0;
3540 need_space = 0;
3541 for (p = mods; p != NULL; p = p->next)
3543 if (p->printed)
3544 break;
3546 saw_mod = 1;
3547 switch (p->mod->type)
3549 case DEMANGLE_COMPONENT_POINTER:
3550 case DEMANGLE_COMPONENT_REFERENCE:
3551 need_paren = 1;
3552 break;
3553 case DEMANGLE_COMPONENT_RESTRICT:
3554 case DEMANGLE_COMPONENT_VOLATILE:
3555 case DEMANGLE_COMPONENT_CONST:
3556 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
3557 case DEMANGLE_COMPONENT_COMPLEX:
3558 case DEMANGLE_COMPONENT_IMAGINARY:
3559 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
3560 need_space = 1;
3561 need_paren = 1;
3562 break;
3563 case DEMANGLE_COMPONENT_RESTRICT_THIS:
3564 case DEMANGLE_COMPONENT_VOLATILE_THIS:
3565 case DEMANGLE_COMPONENT_CONST_THIS:
3566 break;
3567 default:
3568 break;
3570 if (need_paren)
3571 break;
3574 if (d_left (dc) != NULL && ! saw_mod)
3575 need_paren = 1;
3577 if (need_paren)
3579 if (! need_space)
3581 if (d_last_char (dpi) != '('
3582 && d_last_char (dpi) != '*')
3583 need_space = 1;
3585 if (need_space && d_last_char (dpi) != ' ')
3586 d_append_char (dpi, ' ');
3587 d_append_char (dpi, '(');
3590 hold_modifiers = dpi->modifiers;
3591 dpi->modifiers = NULL;
3593 d_print_mod_list (dpi, mods, 0);
3595 if (need_paren)
3596 d_append_char (dpi, ')');
3598 d_append_char (dpi, '(');
3600 if (d_right (dc) != NULL)
3601 d_print_comp (dpi, d_right (dc));
3603 d_append_char (dpi, ')');
3605 d_print_mod_list (dpi, mods, 1);
3607 dpi->modifiers = hold_modifiers;
3610 /* Print an array type, except for the element type. */
3612 static void
3613 d_print_array_type (struct d_print_info *dpi,
3614 const struct demangle_component *dc,
3615 struct d_print_mod *mods)
3617 int need_space;
3619 need_space = 1;
3620 if (mods != NULL)
3622 int need_paren;
3623 struct d_print_mod *p;
3625 need_paren = 0;
3626 for (p = mods; p != NULL; p = p->next)
3628 if (! p->printed)
3630 if (p->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
3632 need_space = 0;
3633 break;
3635 else
3637 need_paren = 1;
3638 need_space = 1;
3639 break;
3644 if (need_paren)
3645 d_append_string_constant (dpi, " (");
3647 d_print_mod_list (dpi, mods, 0);
3649 if (need_paren)
3650 d_append_char (dpi, ')');
3653 if (need_space)
3654 d_append_char (dpi, ' ');
3656 d_append_char (dpi, '[');
3658 if (d_left (dc) != NULL)
3659 d_print_comp (dpi, d_left (dc));
3661 d_append_char (dpi, ']');
3664 /* Print an operator in an expression. */
3666 static void
3667 d_print_expr_op (struct d_print_info *dpi,
3668 const struct demangle_component *dc)
3670 if (dc->type == DEMANGLE_COMPONENT_OPERATOR)
3671 d_append_buffer (dpi, dc->u.s_operator.op->name,
3672 dc->u.s_operator.op->len);
3673 else
3674 d_print_comp (dpi, dc);
3677 /* Print a cast. */
3679 static void
3680 d_print_cast (struct d_print_info *dpi,
3681 const struct demangle_component *dc)
3683 if (d_left (dc)->type != DEMANGLE_COMPONENT_TEMPLATE)
3684 d_print_comp (dpi, d_left (dc));
3685 else
3687 struct d_print_mod *hold_dpm;
3688 struct d_print_template dpt;
3690 /* It appears that for a templated cast operator, we need to put
3691 the template parameters in scope for the operator name, but
3692 not for the parameters. The effect is that we need to handle
3693 the template printing here. */
3695 hold_dpm = dpi->modifiers;
3696 dpi->modifiers = NULL;
3698 dpt.next = dpi->templates;
3699 dpi->templates = &dpt;
3700 dpt.template_decl = d_left (dc);
3702 d_print_comp (dpi, d_left (d_left (dc)));
3704 dpi->templates = dpt.next;
3706 if (d_last_char (dpi) == '<')
3707 d_append_char (dpi, ' ');
3708 d_append_char (dpi, '<');
3709 d_print_comp (dpi, d_right (d_left (dc)));
3710 /* Avoid generating two consecutive '>' characters, to avoid
3711 the C++ syntactic ambiguity. */
3712 if (d_last_char (dpi) == '>')
3713 d_append_char (dpi, ' ');
3714 d_append_char (dpi, '>');
3716 dpi->modifiers = hold_dpm;
3720 /* Initialize the information structure we use to pass around
3721 information. */
3723 CP_STATIC_IF_GLIBCPP_V3
3724 void
3725 cplus_demangle_init_info (const char *mangled, int options, size_t len,
3726 struct d_info *di)
3728 di->s = mangled;
3729 di->send = mangled + len;
3730 di->options = options;
3732 di->n = mangled;
3734 /* We can not need more components than twice the number of chars in
3735 the mangled string. Most components correspond directly to
3736 chars, but the ARGLIST types are exceptions. */
3737 di->num_comps = 2 * len;
3738 di->next_comp = 0;
3740 /* Similarly, we can not need more substitutions than there are
3741 chars in the mangled string. */
3742 di->num_subs = len;
3743 di->next_sub = 0;
3744 di->did_subs = 0;
3746 di->last_name = NULL;
3748 di->expansion = 0;
3751 /* Entry point for the demangler. If MANGLED is a g++ v3 ABI mangled
3752 name, return a buffer allocated with malloc holding the demangled
3753 name. OPTIONS is the usual libiberty demangler options. On
3754 success, this sets *PALC to the allocated size of the returned
3755 buffer. On failure, this sets *PALC to 0 for a bad name, or 1 for
3756 a memory allocation failure. On failure, this returns NULL. */
3758 static char *
3759 d_demangle (const char* mangled, int options, size_t *palc)
3761 size_t len;
3762 int type;
3763 struct d_info di;
3764 struct demangle_component *dc;
3765 int estimate;
3766 char *ret;
3768 *palc = 0;
3770 len = strlen (mangled);
3772 if (mangled[0] == '_' && mangled[1] == 'Z')
3773 type = 0;
3774 else if (strncmp (mangled, "_GLOBAL_", 8) == 0
3775 && (mangled[8] == '.' || mangled[8] == '_' || mangled[8] == '$')
3776 && (mangled[9] == 'D' || mangled[9] == 'I')
3777 && mangled[10] == '_')
3779 char *r;
3781 r = (char *) malloc (40 + len - 11);
3782 if (r == NULL)
3783 *palc = 1;
3784 else
3786 if (mangled[9] == 'I')
3787 strcpy (r, "global constructors keyed to ");
3788 else
3789 strcpy (r, "global destructors keyed to ");
3790 strcat (r, mangled + 11);
3792 return r;
3794 else
3796 if ((options & DMGL_TYPES) == 0)
3797 return NULL;
3798 type = 1;
3801 cplus_demangle_init_info (mangled, options, len, &di);
3804 #ifdef CP_DYNAMIC_ARRAYS
3805 __extension__ struct demangle_component comps[di.num_comps];
3806 __extension__ struct demangle_component *subs[di.num_subs];
3808 di.comps = &comps[0];
3809 di.subs = &subs[0];
3810 #else
3811 di.comps = ((struct demangle_component *)
3812 malloc (di.num_comps * sizeof (struct demangle_component)));
3813 di.subs = ((struct demangle_component **)
3814 malloc (di.num_subs * sizeof (struct demangle_component *)));
3815 if (di.comps == NULL || di.subs == NULL)
3817 if (di.comps != NULL)
3818 free (di.comps);
3819 if (di.subs != NULL)
3820 free (di.subs);
3821 *palc = 1;
3822 return NULL;
3824 #endif
3826 if (! type)
3827 dc = cplus_demangle_mangled_name (&di, 1);
3828 else
3829 dc = cplus_demangle_type (&di);
3831 /* If DMGL_PARAMS is set, then if we didn't consume the entire
3832 mangled string, then we didn't successfully demangle it. If
3833 DMGL_PARAMS is not set, we didn't look at the trailing
3834 parameters. */
3835 if (((options & DMGL_PARAMS) != 0) && d_peek_char (&di) != '\0')
3836 dc = NULL;
3838 #ifdef CP_DEMANGLE_DEBUG
3839 if (dc == NULL)
3840 printf ("failed demangling\n");
3841 else
3842 d_dump (dc, 0);
3843 #endif
3845 /* We try to guess the length of the demangled string, to minimize
3846 calls to realloc during demangling. */
3847 estimate = len + di.expansion + 10 * di.did_subs;
3848 estimate += estimate / 8;
3850 ret = NULL;
3851 if (dc != NULL)
3852 ret = cplus_demangle_print (options, dc, estimate, palc);
3854 #ifndef CP_DYNAMIC_ARRAYS
3855 free (di.comps);
3856 free (di.subs);
3857 #endif
3859 #ifdef CP_DEMANGLE_DEBUG
3860 if (ret != NULL)
3862 int rlen;
3864 rlen = strlen (ret);
3865 if (rlen > 2 * estimate)
3866 printf ("*** Length %d much greater than estimate %d\n",
3867 rlen, estimate);
3868 else if (rlen > estimate)
3869 printf ("*** Length %d greater than estimate %d\n",
3870 rlen, estimate);
3871 else if (rlen < estimate / 2)
3872 printf ("*** Length %d much less than estimate %d\n",
3873 rlen, estimate);
3875 #endif
3878 return ret;
3881 #if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3)
3883 extern char *__cxa_demangle (const char *, char *, size_t *, int *);
3885 /* ia64 ABI-mandated entry point in the C++ runtime library for
3886 performing demangling. MANGLED_NAME is a NUL-terminated character
3887 string containing the name to be demangled.
3889 OUTPUT_BUFFER is a region of memory, allocated with malloc, of
3890 *LENGTH bytes, into which the demangled name is stored. If
3891 OUTPUT_BUFFER is not long enough, it is expanded using realloc.
3892 OUTPUT_BUFFER may instead be NULL; in that case, the demangled name
3893 is placed in a region of memory allocated with malloc.
3895 If LENGTH is non-NULL, the length of the buffer conaining the
3896 demangled name, is placed in *LENGTH.
3898 The return value is a pointer to the start of the NUL-terminated
3899 demangled name, or NULL if the demangling fails. The caller is
3900 responsible for deallocating this memory using free.
3902 *STATUS is set to one of the following values:
3903 0: The demangling operation succeeded.
3904 -1: A memory allocation failure occurred.
3905 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
3906 -3: One of the arguments is invalid.
3908 The demangling is performed using the C++ ABI mangling rules, with
3909 GNU extensions. */
3911 char *
3912 __cxa_demangle (const char *mangled_name, char *output_buffer,
3913 size_t *length, int *status)
3915 char *demangled;
3916 size_t alc;
3918 if (mangled_name == NULL)
3920 if (status != NULL)
3921 *status = -3;
3922 return NULL;
3925 if (output_buffer != NULL && length == NULL)
3927 if (status != NULL)
3928 *status = -3;
3929 return NULL;
3932 demangled = d_demangle (mangled_name, DMGL_PARAMS | DMGL_TYPES, &alc);
3934 if (demangled == NULL)
3936 if (status != NULL)
3938 if (alc == 1)
3939 *status = -1;
3940 else
3941 *status = -2;
3943 return NULL;
3946 if (output_buffer == NULL)
3948 if (length != NULL)
3949 *length = alc;
3951 else
3953 if (strlen (demangled) < *length)
3955 strcpy (output_buffer, demangled);
3956 free (demangled);
3957 demangled = output_buffer;
3959 else
3961 free (output_buffer);
3962 *length = alc;
3966 if (status != NULL)
3967 *status = 0;
3969 return demangled;
3972 #else /* ! (IN_LIBGCC2 || IN_GLIBCPP_V3) */
3974 /* Entry point for libiberty demangler. If MANGLED is a g++ v3 ABI
3975 mangled name, return a buffer allocated with malloc holding the
3976 demangled name. Otherwise, return NULL. */
3978 char *
3979 cplus_demangle_v3 (const char* mangled, int options)
3981 size_t alc;
3983 return d_demangle (mangled, options, &alc);
3986 /* Demangle a Java symbol. Java uses a subset of the V3 ABI C++ mangling
3987 conventions, but the output formatting is a little different.
3988 This instructs the C++ demangler not to emit pointer characters ("*"), and
3989 to use Java's namespace separator symbol ("." instead of "::"). It then
3990 does an additional pass over the demangled output to replace instances
3991 of JArray<TYPE> with TYPE[]. */
3993 char *
3994 java_demangle_v3 (const char* mangled)
3996 size_t alc;
3997 char *demangled;
3998 int nesting;
3999 char *from;
4000 char *to;
4002 demangled = d_demangle (mangled, DMGL_JAVA | DMGL_PARAMS, &alc);
4004 if (demangled == NULL)
4005 return NULL;
4007 nesting = 0;
4008 from = demangled;
4009 to = from;
4010 while (*from != '\0')
4012 if (strncmp (from, "JArray<", 7) == 0)
4014 from += 7;
4015 ++nesting;
4017 else if (nesting > 0 && *from == '>')
4019 while (to > demangled && to[-1] == ' ')
4020 --to;
4021 *to++ = '[';
4022 *to++ = ']';
4023 --nesting;
4024 ++from;
4026 else
4027 *to++ = *from++;
4030 *to = '\0';
4032 return demangled;
4035 #endif /* IN_LIBGCC2 || IN_GLIBCPP_V3 */
4037 #ifndef IN_GLIBCPP_V3
4039 /* Demangle a string in order to find out whether it is a constructor
4040 or destructor. Return non-zero on success. Set *CTOR_KIND and
4041 *DTOR_KIND appropriately. */
4043 static int
4044 is_ctor_or_dtor (const char *mangled,
4045 enum gnu_v3_ctor_kinds *ctor_kind,
4046 enum gnu_v3_dtor_kinds *dtor_kind)
4048 struct d_info di;
4049 struct demangle_component *dc;
4050 int ret;
4052 *ctor_kind = (enum gnu_v3_ctor_kinds) 0;
4053 *dtor_kind = (enum gnu_v3_dtor_kinds) 0;
4055 cplus_demangle_init_info (mangled, DMGL_GNU_V3, strlen (mangled), &di);
4058 #ifdef CP_DYNAMIC_ARRAYS
4059 __extension__ struct demangle_component comps[di.num_comps];
4060 __extension__ struct demangle_component *subs[di.num_subs];
4062 di.comps = &comps[0];
4063 di.subs = &subs[0];
4064 #else
4065 di.comps = ((struct demangle_component *)
4066 malloc (di.num_comps * sizeof (struct demangle_component)));
4067 di.subs = ((struct demangle_component **)
4068 malloc (di.num_subs * sizeof (struct demangle_component *)));
4069 if (di.comps == NULL || di.subs == NULL)
4071 if (di.comps != NULL)
4072 free (di.comps);
4073 if (di.subs != NULL)
4074 free (di.subs);
4075 return 0;
4077 #endif
4079 dc = cplus_demangle_mangled_name (&di, 1);
4081 /* Note that because we did not pass DMGL_PARAMS, we don't expect
4082 to demangle the entire string. */
4084 ret = 0;
4085 while (dc != NULL)
4087 switch (dc->type)
4089 default:
4090 dc = NULL;
4091 break;
4092 case DEMANGLE_COMPONENT_TYPED_NAME:
4093 case DEMANGLE_COMPONENT_TEMPLATE:
4094 case DEMANGLE_COMPONENT_RESTRICT_THIS:
4095 case DEMANGLE_COMPONENT_VOLATILE_THIS:
4096 case DEMANGLE_COMPONENT_CONST_THIS:
4097 dc = d_left (dc);
4098 break;
4099 case DEMANGLE_COMPONENT_QUAL_NAME:
4100 case DEMANGLE_COMPONENT_LOCAL_NAME:
4101 dc = d_right (dc);
4102 break;
4103 case DEMANGLE_COMPONENT_CTOR:
4104 *ctor_kind = dc->u.s_ctor.kind;
4105 ret = 1;
4106 dc = NULL;
4107 break;
4108 case DEMANGLE_COMPONENT_DTOR:
4109 *dtor_kind = dc->u.s_dtor.kind;
4110 ret = 1;
4111 dc = NULL;
4112 break;
4116 #ifndef CP_DYNAMIC_ARRAYS
4117 free (di.subs);
4118 free (di.comps);
4119 #endif
4122 return ret;
4125 /* Return whether NAME is the mangled form of a g++ V3 ABI constructor
4126 name. A non-zero return indicates the type of constructor. */
4128 enum gnu_v3_ctor_kinds
4129 is_gnu_v3_mangled_ctor (const char *name)
4131 enum gnu_v3_ctor_kinds ctor_kind;
4132 enum gnu_v3_dtor_kinds dtor_kind;
4134 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
4135 return (enum gnu_v3_ctor_kinds) 0;
4136 return ctor_kind;
4140 /* Return whether NAME is the mangled form of a g++ V3 ABI destructor
4141 name. A non-zero return indicates the type of destructor. */
4143 enum gnu_v3_dtor_kinds
4144 is_gnu_v3_mangled_dtor (const char *name)
4146 enum gnu_v3_ctor_kinds ctor_kind;
4147 enum gnu_v3_dtor_kinds dtor_kind;
4149 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
4150 return (enum gnu_v3_dtor_kinds) 0;
4151 return dtor_kind;
4154 #endif /* IN_GLIBCPP_V3 */
4156 #ifdef STANDALONE_DEMANGLER
4158 #include "getopt.h"
4159 #include "dyn-string.h"
4161 static void print_usage (FILE* fp, int exit_value);
4163 #define IS_ALPHA(CHAR) \
4164 (((CHAR) >= 'a' && (CHAR) <= 'z') \
4165 || ((CHAR) >= 'A' && (CHAR) <= 'Z'))
4167 /* Non-zero if CHAR is a character than can occur in a mangled name. */
4168 #define is_mangled_char(CHAR) \
4169 (IS_ALPHA (CHAR) || IS_DIGIT (CHAR) \
4170 || (CHAR) == '_' || (CHAR) == '.' || (CHAR) == '$')
4172 /* The name of this program, as invoked. */
4173 const char* program_name;
4175 /* Prints usage summary to FP and then exits with EXIT_VALUE. */
4177 static void
4178 print_usage (FILE* fp, int exit_value)
4180 fprintf (fp, "Usage: %s [options] [names ...]\n", program_name);
4181 fprintf (fp, "Options:\n");
4182 fprintf (fp, " -h,--help Display this message.\n");
4183 fprintf (fp, " -p,--no-params Don't display function parameters\n");
4184 fprintf (fp, " -v,--verbose Produce verbose demanglings.\n");
4185 fprintf (fp, "If names are provided, they are demangled. Otherwise filters standard input.\n");
4187 exit (exit_value);
4190 /* Option specification for getopt_long. */
4191 static const struct option long_options[] =
4193 { "help", no_argument, NULL, 'h' },
4194 { "no-params", no_argument, NULL, 'p' },
4195 { "verbose", no_argument, NULL, 'v' },
4196 { NULL, no_argument, NULL, 0 },
4199 /* Main entry for a demangling filter executable. It will demangle
4200 its command line arguments, if any. If none are provided, it will
4201 filter stdin to stdout, replacing any recognized mangled C++ names
4202 with their demangled equivalents. */
4205 main (int argc, char *argv[])
4207 int i;
4208 int opt_char;
4209 int options = DMGL_PARAMS | DMGL_ANSI | DMGL_TYPES;
4211 /* Use the program name of this program, as invoked. */
4212 program_name = argv[0];
4214 /* Parse options. */
4217 opt_char = getopt_long (argc, argv, "hpv", long_options, NULL);
4218 switch (opt_char)
4220 case '?': /* Unrecognized option. */
4221 print_usage (stderr, 1);
4222 break;
4224 case 'h':
4225 print_usage (stdout, 0);
4226 break;
4228 case 'p':
4229 options &= ~ DMGL_PARAMS;
4230 break;
4232 case 'v':
4233 options |= DMGL_VERBOSE;
4234 break;
4237 while (opt_char != -1);
4239 if (optind == argc)
4240 /* No command line arguments were provided. Filter stdin. */
4242 dyn_string_t mangled = dyn_string_new (3);
4243 char *s;
4245 /* Read all of input. */
4246 while (!feof (stdin))
4248 char c;
4250 /* Pile characters into mangled until we hit one that can't
4251 occur in a mangled name. */
4252 c = getchar ();
4253 while (!feof (stdin) && is_mangled_char (c))
4255 dyn_string_append_char (mangled, c);
4256 if (feof (stdin))
4257 break;
4258 c = getchar ();
4261 if (dyn_string_length (mangled) > 0)
4263 #ifdef IN_GLIBCPP_V3
4264 s = __cxa_demangle (dyn_string_buf (mangled), NULL, NULL, NULL);
4265 #else
4266 s = cplus_demangle_v3 (dyn_string_buf (mangled), options);
4267 #endif
4269 if (s != NULL)
4271 fputs (s, stdout);
4272 free (s);
4274 else
4276 /* It might not have been a mangled name. Print the
4277 original text. */
4278 fputs (dyn_string_buf (mangled), stdout);
4281 dyn_string_clear (mangled);
4284 /* If we haven't hit EOF yet, we've read one character that
4285 can't occur in a mangled name, so print it out. */
4286 if (!feof (stdin))
4287 putchar (c);
4290 dyn_string_delete (mangled);
4292 else
4293 /* Demangle command line arguments. */
4295 /* Loop over command line arguments. */
4296 for (i = optind; i < argc; ++i)
4298 char *s;
4299 #ifdef IN_GLIBCPP_V3
4300 int status;
4301 #endif
4303 /* Attempt to demangle. */
4304 #ifdef IN_GLIBCPP_V3
4305 s = __cxa_demangle (argv[i], NULL, NULL, &status);
4306 #else
4307 s = cplus_demangle_v3 (argv[i], options);
4308 #endif
4310 /* If it worked, print the demangled name. */
4311 if (s != NULL)
4313 printf ("%s\n", s);
4314 free (s);
4316 else
4318 #ifdef IN_GLIBCPP_V3
4319 fprintf (stderr, "Failed: %s (status %d)\n", argv[i], status);
4320 #else
4321 fprintf (stderr, "Failed: %s\n", argv[i]);
4322 #endif
4327 return 0;
4330 #endif /* STANDALONE_DEMANGLER */