* trans-stmt.c (gfc_trans_simple_do): New function.
[official-gcc.git] / libiberty / cp-demangle.c
blob8608bc82507ca344153535c332fdcd45d6ebf0fd
1 /* Demangler for g++ V3 ABI.
2 Copyright (C) 2003, 2004 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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
113 d_fill_name PARAMS ((struct demangle_component *, const char *, int));
115 #define cplus_demangle_fill_extended_operator d_fill_extended_operator
116 static int
117 d_fill_extended_operator PARAMS ((struct demangle_component *, int,
118 struct demangle_component *));
120 #define cplus_demangle_fill_ctor d_fill_ctor
121 static int
122 d_fill_ctor PARAMS ((struct demangle_component *, enum gnu_v3_ctor_kinds,
123 struct demangle_component *));
125 #define cplus_demangle_fill_dtor d_fill_dtor
126 static int
127 d_fill_dtor PARAMS ((struct demangle_component *, enum gnu_v3_dtor_kinds,
128 struct demangle_component *));
130 #define cplus_demangle_mangled_name d_mangled_name
131 static struct demangle_component *
132 d_mangled_name PARAMS ((struct d_info *, int));
134 #define cplus_demangle_type d_type
135 static struct demangle_component *
136 d_type PARAMS ((struct d_info *));
138 #define cplus_demangle_print d_print
139 static char *
140 d_print PARAMS ((int, const struct demangle_component *, int, size_t *));
142 #define cplus_demangle_init_info d_init_info
143 static void
144 d_init_info PARAMS ((const char *, int, size_t, struct d_info *));
146 #else /* ! defined(IN_GLIBCPP_V3) */
147 #define CP_STATIC_IF_GLIBCPP_V3
148 #endif /* ! defined(IN_GLIBCPP_V3) */
150 /* See if the compiler supports dynamic arrays. */
152 #ifdef __GNUC__
153 #define CP_DYNAMIC_ARRAYS
154 #else
155 #ifdef __STDC__
156 #ifdef __STDC_VERSION__
157 #if __STDC_VERSION__ >= 199901L
158 #define CP_DYNAMIC_ARRAYS
159 #endif /* __STDC__VERSION >= 199901L */
160 #endif /* defined (__STDC_VERSION__) */
161 #endif /* defined (__STDC__) */
162 #endif /* ! defined (__GNUC__) */
164 /* We avoid pulling in the ctype tables, to prevent pulling in
165 additional unresolved symbols when this code is used in a library.
166 FIXME: Is this really a valid reason? This comes from the original
167 V3 demangler code.
169 As of this writing this file has the following undefined references
170 when compiled with -DIN_GLIBCPP_V3: malloc, realloc, free, memcpy,
171 strcpy, strcat, strlen. */
173 #define IS_DIGIT(c) ((c) >= '0' && (c) <= '9')
174 #define IS_UPPER(c) ((c) >= 'A' && (c) <= 'Z')
175 #define IS_LOWER(c) ((c) >= 'a' && (c) <= 'z')
177 /* The prefix prepended by GCC to an identifier represnting the
178 anonymous namespace. */
179 #define ANONYMOUS_NAMESPACE_PREFIX "_GLOBAL_"
180 #define ANONYMOUS_NAMESPACE_PREFIX_LEN \
181 (sizeof (ANONYMOUS_NAMESPACE_PREFIX) - 1)
183 /* Information we keep for the standard substitutions. */
185 struct d_standard_sub_info
187 /* The code for this substitution. */
188 char code;
189 /* The simple string it expands to. */
190 const char *simple_expansion;
191 /* The length of the simple expansion. */
192 int simple_len;
193 /* The results of a full, verbose, expansion. This is used when
194 qualifying a constructor/destructor, or when in verbose mode. */
195 const char *full_expansion;
196 /* The length of the full expansion. */
197 int full_len;
198 /* What to set the last_name field of d_info to; NULL if we should
199 not set it. This is only relevant when qualifying a
200 constructor/destructor. */
201 const char *set_last_name;
202 /* The length of set_last_name. */
203 int set_last_name_len;
206 /* Accessors for subtrees of struct demangle_component. */
208 #define d_left(dc) ((dc)->u.s_binary.left)
209 #define d_right(dc) ((dc)->u.s_binary.right)
211 /* A list of templates. This is used while printing. */
213 struct d_print_template
215 /* Next template on the list. */
216 struct d_print_template *next;
217 /* This template. */
218 const struct demangle_component *template;
221 /* A list of type modifiers. This is used while printing. */
223 struct d_print_mod
225 /* Next modifier on the list. These are in the reverse of the order
226 in which they appeared in the mangled string. */
227 struct d_print_mod *next;
228 /* The modifier. */
229 const struct demangle_component *mod;
230 /* Whether this modifier was printed. */
231 int printed;
232 /* The list of templates which applies to this modifier. */
233 struct d_print_template *templates;
236 /* We use this structure to hold information during printing. */
238 struct d_print_info
240 /* The options passed to the demangler. */
241 int options;
242 /* Buffer holding the result. */
243 char *buf;
244 /* Current length of data in buffer. */
245 size_t len;
246 /* Allocated size of buffer. */
247 size_t alc;
248 /* The current list of templates, if any. */
249 struct d_print_template *templates;
250 /* The current list of modifiers (e.g., pointer, reference, etc.),
251 if any. */
252 struct d_print_mod *modifiers;
253 /* Set to 1 if we had a memory allocation failure. */
254 int allocation_failure;
257 #define d_print_saw_error(dpi) ((dpi)->buf == NULL)
259 #define d_append_char(dpi, c) \
260 do \
262 if ((dpi)->buf != NULL && (dpi)->len < (dpi)->alc) \
263 (dpi)->buf[(dpi)->len++] = (c); \
264 else \
265 d_print_append_char ((dpi), (c)); \
267 while (0)
269 #define d_append_buffer(dpi, s, l) \
270 do \
272 if ((dpi)->buf != NULL && (dpi)->len + (l) <= (dpi)->alc) \
274 memcpy ((dpi)->buf + (dpi)->len, (s), (l)); \
275 (dpi)->len += l; \
277 else \
278 d_print_append_buffer ((dpi), (s), (l)); \
280 while (0)
282 #define d_append_string_constant(dpi, s) \
283 d_append_buffer (dpi, (s), sizeof (s) - 1)
285 #define d_last_char(dpi) \
286 ((dpi)->buf == NULL || (dpi)->len == 0 ? '\0' : (dpi)->buf[(dpi)->len - 1])
288 #ifdef CP_DEMANGLE_DEBUG
289 static void
290 d_dump PARAMS ((struct demangle_component *, int));
291 #endif
293 static struct demangle_component *
294 d_make_empty PARAMS ((struct d_info *));
296 static struct demangle_component *
297 d_make_comp PARAMS ((struct d_info *, enum demangle_component_type,
298 struct demangle_component *,
299 struct demangle_component *));
301 static struct demangle_component *
302 d_make_name PARAMS ((struct d_info *, const char *, int));
304 static struct demangle_component *
305 d_make_builtin_type PARAMS ((struct d_info *,
306 const struct demangle_builtin_type_info *));
308 static struct demangle_component *
309 d_make_operator PARAMS ((struct d_info *,
310 const struct demangle_operator_info *));
312 static struct demangle_component *
313 d_make_extended_operator PARAMS ((struct d_info *, int,
314 struct demangle_component *));
316 static struct demangle_component *
317 d_make_ctor PARAMS ((struct d_info *, enum gnu_v3_ctor_kinds,
318 struct demangle_component *));
320 static struct demangle_component *
321 d_make_dtor PARAMS ((struct d_info *, enum gnu_v3_dtor_kinds,
322 struct demangle_component *));
324 static struct demangle_component *
325 d_make_template_param PARAMS ((struct d_info *, long));
327 static struct demangle_component *
328 d_make_sub PARAMS ((struct d_info *, const char *, int));
330 static int
331 has_return_type PARAMS ((struct demangle_component *));
333 static int
334 is_ctor_dtor_or_conversion PARAMS ((struct demangle_component *));
336 static struct demangle_component *
337 d_encoding PARAMS ((struct d_info *, int));
339 static struct demangle_component *
340 d_name PARAMS ((struct d_info *));
342 static struct demangle_component *
343 d_nested_name PARAMS ((struct d_info *));
345 static struct demangle_component *
346 d_prefix PARAMS ((struct d_info *));
348 static struct demangle_component *
349 d_unqualified_name PARAMS ((struct d_info *));
351 static struct demangle_component *
352 d_source_name PARAMS ((struct d_info *));
354 static long
355 d_number PARAMS ((struct d_info *));
357 static struct demangle_component *
358 d_identifier PARAMS ((struct d_info *, int));
360 static struct demangle_component *
361 d_operator_name PARAMS ((struct d_info *));
363 static struct demangle_component *
364 d_special_name PARAMS ((struct d_info *));
366 static int
367 d_call_offset PARAMS ((struct d_info *, int));
369 static struct demangle_component *
370 d_ctor_dtor_name PARAMS ((struct d_info *));
372 static struct demangle_component **
373 d_cv_qualifiers PARAMS ((struct d_info *, struct demangle_component **, int));
375 static struct demangle_component *
376 d_function_type PARAMS ((struct d_info *));
378 static struct demangle_component *
379 d_bare_function_type PARAMS ((struct d_info *, int));
381 static struct demangle_component *
382 d_class_enum_type PARAMS ((struct d_info *));
384 static struct demangle_component *
385 d_array_type PARAMS ((struct d_info *));
387 static struct demangle_component *
388 d_pointer_to_member_type PARAMS ((struct d_info *));
390 static struct demangle_component *
391 d_template_param PARAMS ((struct d_info *));
393 static struct demangle_component *
394 d_template_args PARAMS ((struct d_info *));
396 static struct demangle_component *
397 d_template_arg PARAMS ((struct d_info *));
399 static struct demangle_component *
400 d_expression PARAMS ((struct d_info *));
402 static struct demangle_component *
403 d_expr_primary PARAMS ((struct d_info *));
405 static struct demangle_component *
406 d_local_name PARAMS ((struct d_info *));
408 static int
409 d_discriminator PARAMS ((struct d_info *));
411 static int
412 d_add_substitution PARAMS ((struct d_info *, struct demangle_component *));
414 static struct demangle_component *
415 d_substitution PARAMS ((struct d_info *, int));
417 static void
418 d_print_resize PARAMS ((struct d_print_info *, size_t));
420 static void
421 d_print_append_char PARAMS ((struct d_print_info *, int));
423 static void
424 d_print_append_buffer PARAMS ((struct d_print_info *, const char *, size_t));
426 static void
427 d_print_error PARAMS ((struct d_print_info *));
429 static void
430 d_print_comp PARAMS ((struct d_print_info *,
431 const struct demangle_component *));
433 static void
434 d_print_java_identifier PARAMS ((struct d_print_info *, const char *, int));
436 static void
437 d_print_mod_list PARAMS ((struct d_print_info *, struct d_print_mod *, int));
439 static void
440 d_print_mod PARAMS ((struct d_print_info *,
441 const struct demangle_component *));
443 static void
444 d_print_function_type PARAMS ((struct d_print_info *,
445 const struct demangle_component *,
446 struct d_print_mod *));
448 static void
449 d_print_array_type PARAMS ((struct d_print_info *,
450 const struct demangle_component *,
451 struct d_print_mod *));
453 static void
454 d_print_expr_op PARAMS ((struct d_print_info *,
455 const struct demangle_component *));
457 static void
458 d_print_cast PARAMS ((struct d_print_info *,
459 const struct demangle_component *));
461 static char *
462 d_demangle PARAMS ((const char *, int, size_t *));
464 #ifdef CP_DEMANGLE_DEBUG
466 static void
467 d_dump (dc, indent)
468 struct demangle_component *dc;
469 int indent;
471 int i;
473 if (dc == NULL)
474 return;
476 for (i = 0; i < indent; ++i)
477 putchar (' ');
479 switch (dc->type)
481 case DEMANGLE_COMPONENT_NAME:
482 printf ("name '%.*s'\n", dc->u.s_name.len, dc->u.s_name.s);
483 return;
484 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
485 printf ("template parameter %ld\n", dc->u.s_number.number);
486 return;
487 case DEMANGLE_COMPONENT_CTOR:
488 printf ("constructor %d\n", (int) dc->u.s_ctor.kind);
489 d_dump (dc->u.s_ctor.name, indent + 2);
490 return;
491 case DEMANGLE_COMPONENT_DTOR:
492 printf ("destructor %d\n", (int) dc->u.s_dtor.kind);
493 d_dump (dc->u.s_dtor.name, indent + 2);
494 return;
495 case DEMANGLE_COMPONENT_SUB_STD:
496 printf ("standard substitution %s\n", dc->u.s_string.string);
497 return;
498 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
499 printf ("builtin type %s\n", dc->u.s_builtin.type->name);
500 return;
501 case DEMANGLE_COMPONENT_OPERATOR:
502 printf ("operator %s\n", dc->u.s_operator.op->name);
503 return;
504 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
505 printf ("extended operator with %d args\n",
506 dc->u.s_extended_operator.args);
507 d_dump (dc->u.s_extended_operator.name, indent + 2);
508 return;
510 case DEMANGLE_COMPONENT_QUAL_NAME:
511 printf ("qualified name\n");
512 break;
513 case DEMANGLE_COMPONENT_LOCAL_NAME:
514 printf ("local name\n");
515 break;
516 case DEMANGLE_COMPONENT_TYPED_NAME:
517 printf ("typed name\n");
518 break;
519 case DEMANGLE_COMPONENT_TEMPLATE:
520 printf ("template\n");
521 break;
522 case DEMANGLE_COMPONENT_VTABLE:
523 printf ("vtable\n");
524 break;
525 case DEMANGLE_COMPONENT_VTT:
526 printf ("VTT\n");
527 break;
528 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
529 printf ("construction vtable\n");
530 break;
531 case DEMANGLE_COMPONENT_TYPEINFO:
532 printf ("typeinfo\n");
533 break;
534 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
535 printf ("typeinfo name\n");
536 break;
537 case DEMANGLE_COMPONENT_TYPEINFO_FN:
538 printf ("typeinfo function\n");
539 break;
540 case DEMANGLE_COMPONENT_THUNK:
541 printf ("thunk\n");
542 break;
543 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
544 printf ("virtual thunk\n");
545 break;
546 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
547 printf ("covariant thunk\n");
548 break;
549 case DEMANGLE_COMPONENT_JAVA_CLASS:
550 printf ("java class\n");
551 break;
552 case DEMANGLE_COMPONENT_GUARD:
553 printf ("guard\n");
554 break;
555 case DEMANGLE_COMPONENT_REFTEMP:
556 printf ("reference temporary\n");
557 break;
558 case DEMANGLE_COMPONENT_RESTRICT:
559 printf ("restrict\n");
560 break;
561 case DEMANGLE_COMPONENT_VOLATILE:
562 printf ("volatile\n");
563 break;
564 case DEMANGLE_COMPONENT_CONST:
565 printf ("const\n");
566 break;
567 case DEMANGLE_COMPONENT_RESTRICT_THIS:
568 printf ("restrict this\n");
569 break;
570 case DEMANGLE_COMPONENT_VOLATILE_THIS:
571 printf ("volatile this\n");
572 break;
573 case DEMANGLE_COMPONENT_CONST_THIS:
574 printf ("const this\n");
575 break;
576 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
577 printf ("vendor type qualifier\n");
578 break;
579 case DEMANGLE_COMPONENT_POINTER:
580 printf ("pointer\n");
581 break;
582 case DEMANGLE_COMPONENT_REFERENCE:
583 printf ("reference\n");
584 break;
585 case DEMANGLE_COMPONENT_COMPLEX:
586 printf ("complex\n");
587 break;
588 case DEMANGLE_COMPONENT_IMAGINARY:
589 printf ("imaginary\n");
590 break;
591 case DEMANGLE_COMPONENT_VENDOR_TYPE:
592 printf ("vendor type\n");
593 break;
594 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
595 printf ("function type\n");
596 break;
597 case DEMANGLE_COMPONENT_ARRAY_TYPE:
598 printf ("array type\n");
599 break;
600 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
601 printf ("pointer to member type\n");
602 break;
603 case DEMANGLE_COMPONENT_ARGLIST:
604 printf ("argument list\n");
605 break;
606 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
607 printf ("template argument list\n");
608 break;
609 case DEMANGLE_COMPONENT_CAST:
610 printf ("cast\n");
611 break;
612 case DEMANGLE_COMPONENT_UNARY:
613 printf ("unary operator\n");
614 break;
615 case DEMANGLE_COMPONENT_BINARY:
616 printf ("binary operator\n");
617 break;
618 case DEMANGLE_COMPONENT_BINARY_ARGS:
619 printf ("binary operator arguments\n");
620 break;
621 case DEMANGLE_COMPONENT_TRINARY:
622 printf ("trinary operator\n");
623 break;
624 case DEMANGLE_COMPONENT_TRINARY_ARG1:
625 printf ("trinary operator arguments 1\n");
626 break;
627 case DEMANGLE_COMPONENT_TRINARY_ARG2:
628 printf ("trinary operator arguments 1\n");
629 break;
630 case DEMANGLE_COMPONENT_LITERAL:
631 printf ("literal\n");
632 break;
633 case DEMANGLE_COMPONENT_LITERAL_NEG:
634 printf ("negative literal\n");
635 break;
638 d_dump (d_left (dc), indent + 2);
639 d_dump (d_right (dc), indent + 2);
642 #endif /* CP_DEMANGLE_DEBUG */
644 /* Fill in a DEMANGLE_COMPONENT_NAME. */
646 CP_STATIC_IF_GLIBCPP_V3
648 cplus_demangle_fill_name (p, s, len)
649 struct demangle_component *p;
650 const char *s;
651 int len;
653 if (p == NULL || s == NULL || len == 0)
654 return 0;
655 p->type = DEMANGLE_COMPONENT_NAME;
656 p->u.s_name.s = s;
657 p->u.s_name.len = len;
658 return 1;
661 /* Fill in a DEMANGLE_COMPONENT_EXTENDED_OPERATOR. */
663 CP_STATIC_IF_GLIBCPP_V3
665 cplus_demangle_fill_extended_operator (p, args, name)
666 struct demangle_component *p;
667 int args;
668 struct demangle_component *name;
670 if (p == NULL || args < 0 || name == NULL)
671 return 0;
672 p->type = DEMANGLE_COMPONENT_EXTENDED_OPERATOR;
673 p->u.s_extended_operator.args = args;
674 p->u.s_extended_operator.name = name;
675 return 1;
678 /* Fill in a DEMANGLE_COMPONENT_CTOR. */
680 CP_STATIC_IF_GLIBCPP_V3
682 cplus_demangle_fill_ctor (p, kind, name)
683 struct demangle_component *p;
684 enum gnu_v3_ctor_kinds kind;
685 struct demangle_component *name;
687 if (p == NULL
688 || name == NULL
689 || (kind < gnu_v3_complete_object_ctor
690 && kind > gnu_v3_complete_object_allocating_ctor))
691 return 0;
692 p->type = DEMANGLE_COMPONENT_CTOR;
693 p->u.s_ctor.kind = kind;
694 p->u.s_ctor.name = name;
695 return 1;
698 /* Fill in a DEMANGLE_COMPONENT_DTOR. */
700 CP_STATIC_IF_GLIBCPP_V3
702 cplus_demangle_fill_dtor (p, kind, name)
703 struct demangle_component *p;
704 enum gnu_v3_dtor_kinds kind;
705 struct demangle_component *name;
707 if (p == NULL
708 || name == NULL
709 || (kind < gnu_v3_deleting_dtor
710 && kind > gnu_v3_base_object_dtor))
711 return 0;
712 p->type = DEMANGLE_COMPONENT_DTOR;
713 p->u.s_dtor.kind = kind;
714 p->u.s_dtor.name = name;
715 return 1;
718 /* Add a new component. */
720 static struct demangle_component *
721 d_make_empty (di)
722 struct d_info *di;
724 struct demangle_component *p;
726 if (di->next_comp >= di->num_comps)
727 return NULL;
728 p = &di->comps[di->next_comp];
729 ++di->next_comp;
730 return p;
733 /* Add a new generic component. */
735 static struct demangle_component *
736 d_make_comp (di, type, left, right)
737 struct d_info *di;
738 enum demangle_component_type type;
739 struct demangle_component *left;
740 struct demangle_component *right;
742 struct demangle_component *p;
744 /* We check for errors here. A typical error would be a NULL return
745 from a subroutine. We catch those here, and return NULL
746 upward. */
747 switch (type)
749 /* These types require two parameters. */
750 case DEMANGLE_COMPONENT_QUAL_NAME:
751 case DEMANGLE_COMPONENT_LOCAL_NAME:
752 case DEMANGLE_COMPONENT_TYPED_NAME:
753 case DEMANGLE_COMPONENT_TEMPLATE:
754 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
755 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
756 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
757 case DEMANGLE_COMPONENT_UNARY:
758 case DEMANGLE_COMPONENT_BINARY:
759 case DEMANGLE_COMPONENT_BINARY_ARGS:
760 case DEMANGLE_COMPONENT_TRINARY:
761 case DEMANGLE_COMPONENT_TRINARY_ARG1:
762 case DEMANGLE_COMPONENT_TRINARY_ARG2:
763 case DEMANGLE_COMPONENT_LITERAL:
764 case DEMANGLE_COMPONENT_LITERAL_NEG:
765 if (left == NULL || right == NULL)
766 return NULL;
767 break;
769 /* These types only require one parameter. */
770 case DEMANGLE_COMPONENT_VTABLE:
771 case DEMANGLE_COMPONENT_VTT:
772 case DEMANGLE_COMPONENT_TYPEINFO:
773 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
774 case DEMANGLE_COMPONENT_TYPEINFO_FN:
775 case DEMANGLE_COMPONENT_THUNK:
776 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
777 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
778 case DEMANGLE_COMPONENT_JAVA_CLASS:
779 case DEMANGLE_COMPONENT_GUARD:
780 case DEMANGLE_COMPONENT_REFTEMP:
781 case DEMANGLE_COMPONENT_POINTER:
782 case DEMANGLE_COMPONENT_REFERENCE:
783 case DEMANGLE_COMPONENT_COMPLEX:
784 case DEMANGLE_COMPONENT_IMAGINARY:
785 case DEMANGLE_COMPONENT_VENDOR_TYPE:
786 case DEMANGLE_COMPONENT_ARGLIST:
787 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
788 case DEMANGLE_COMPONENT_CAST:
789 if (left == NULL)
790 return NULL;
791 break;
793 /* This needs a right parameter, but the left parameter can be
794 empty. */
795 case DEMANGLE_COMPONENT_ARRAY_TYPE:
796 if (right == NULL)
797 return NULL;
798 break;
800 /* These are allowed to have no parameters--in some cases they
801 will be filled in later. */
802 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
803 case DEMANGLE_COMPONENT_RESTRICT:
804 case DEMANGLE_COMPONENT_VOLATILE:
805 case DEMANGLE_COMPONENT_CONST:
806 case DEMANGLE_COMPONENT_RESTRICT_THIS:
807 case DEMANGLE_COMPONENT_VOLATILE_THIS:
808 case DEMANGLE_COMPONENT_CONST_THIS:
809 break;
811 /* Other types should not be seen here. */
812 default:
813 return NULL;
816 p = d_make_empty (di);
817 if (p != NULL)
819 p->type = type;
820 p->u.s_binary.left = left;
821 p->u.s_binary.right = right;
823 return p;
826 /* Add a new name component. */
828 static struct demangle_component *
829 d_make_name (di, s, len)
830 struct d_info *di;
831 const char *s;
832 int len;
834 struct demangle_component *p;
836 p = d_make_empty (di);
837 if (! cplus_demangle_fill_name (p, s, len))
838 return NULL;
839 return p;
842 /* Add a new builtin type component. */
844 static struct demangle_component *
845 d_make_builtin_type (di, type)
846 struct d_info *di;
847 const struct demangle_builtin_type_info *type;
849 struct demangle_component *p;
851 if (type == NULL)
852 return NULL;
853 p = d_make_empty (di);
854 if (p != NULL)
856 p->type = DEMANGLE_COMPONENT_BUILTIN_TYPE;
857 p->u.s_builtin.type = type;
859 return p;
862 /* Add a new operator component. */
864 static struct demangle_component *
865 d_make_operator (di, op)
866 struct d_info *di;
867 const struct demangle_operator_info *op;
869 struct demangle_component *p;
871 p = d_make_empty (di);
872 if (p != NULL)
874 p->type = DEMANGLE_COMPONENT_OPERATOR;
875 p->u.s_operator.op = op;
877 return p;
880 /* Add a new extended operator component. */
882 static struct demangle_component *
883 d_make_extended_operator (di, args, name)
884 struct d_info *di;
885 int args;
886 struct demangle_component *name;
888 struct demangle_component *p;
890 p = d_make_empty (di);
891 if (! cplus_demangle_fill_extended_operator (p, args, name))
892 return NULL;
893 return p;
896 /* Add a new constructor component. */
898 static struct demangle_component *
899 d_make_ctor (di, kind, name)
900 struct d_info *di;
901 enum gnu_v3_ctor_kinds kind;
902 struct demangle_component *name;
904 struct demangle_component *p;
906 p = d_make_empty (di);
907 if (! cplus_demangle_fill_ctor (p, kind, name))
908 return NULL;
909 return p;
912 /* Add a new destructor component. */
914 static struct demangle_component *
915 d_make_dtor (di, kind, name)
916 struct d_info *di;
917 enum gnu_v3_dtor_kinds kind;
918 struct demangle_component *name;
920 struct demangle_component *p;
922 p = d_make_empty (di);
923 if (! cplus_demangle_fill_dtor (p, kind, name))
924 return NULL;
925 return p;
928 /* Add a new template parameter. */
930 static struct demangle_component *
931 d_make_template_param (di, i)
932 struct d_info *di;
933 long i;
935 struct demangle_component *p;
937 p = d_make_empty (di);
938 if (p != NULL)
940 p->type = DEMANGLE_COMPONENT_TEMPLATE_PARAM;
941 p->u.s_number.number = i;
943 return p;
946 /* Add a new standard substitution component. */
948 static struct demangle_component *
949 d_make_sub (di, name, len)
950 struct d_info *di;
951 const char *name;
952 int len;
954 struct demangle_component *p;
956 p = d_make_empty (di);
957 if (p != NULL)
959 p->type = DEMANGLE_COMPONENT_SUB_STD;
960 p->u.s_string.string = name;
961 p->u.s_string.len = len;
963 return p;
966 /* <mangled-name> ::= _Z <encoding>
968 TOP_LEVEL is non-zero when called at the top level. */
970 CP_STATIC_IF_GLIBCPP_V3
971 struct demangle_component *
972 cplus_demangle_mangled_name (di, top_level)
973 struct d_info *di;
974 int top_level;
976 if (d_next_char (di) != '_')
977 return NULL;
978 if (d_next_char (di) != 'Z')
979 return NULL;
980 return d_encoding (di, top_level);
983 /* Return whether a function should have a return type. The argument
984 is the function name, which may be qualified in various ways. The
985 rules are that template functions have return types with some
986 exceptions, function types which are not part of a function name
987 mangling have return types with some exceptions, and non-template
988 function names do not have return types. The exceptions are that
989 constructors, destructors, and conversion operators do not have
990 return types. */
992 static int
993 has_return_type (dc)
994 struct demangle_component *dc;
996 if (dc == NULL)
997 return 0;
998 switch (dc->type)
1000 default:
1001 return 0;
1002 case DEMANGLE_COMPONENT_TEMPLATE:
1003 return ! is_ctor_dtor_or_conversion (d_left (dc));
1004 case DEMANGLE_COMPONENT_RESTRICT_THIS:
1005 case DEMANGLE_COMPONENT_VOLATILE_THIS:
1006 case DEMANGLE_COMPONENT_CONST_THIS:
1007 return has_return_type (d_left (dc));
1011 /* Return whether a name is a constructor, a destructor, or a
1012 conversion operator. */
1014 static int
1015 is_ctor_dtor_or_conversion (dc)
1016 struct demangle_component *dc;
1018 if (dc == NULL)
1019 return 0;
1020 switch (dc->type)
1022 default:
1023 return 0;
1024 case DEMANGLE_COMPONENT_QUAL_NAME:
1025 case DEMANGLE_COMPONENT_LOCAL_NAME:
1026 return is_ctor_dtor_or_conversion (d_right (dc));
1027 case DEMANGLE_COMPONENT_CTOR:
1028 case DEMANGLE_COMPONENT_DTOR:
1029 case DEMANGLE_COMPONENT_CAST:
1030 return 1;
1034 /* <encoding> ::= <(function) name> <bare-function-type>
1035 ::= <(data) name>
1036 ::= <special-name>
1038 TOP_LEVEL is non-zero when called at the top level, in which case
1039 if DMGL_PARAMS is not set we do not demangle the function
1040 parameters. We only set this at the top level, because otherwise
1041 we would not correctly demangle names in local scopes. */
1043 static struct demangle_component *
1044 d_encoding (di, top_level)
1045 struct d_info *di;
1046 int top_level;
1048 char peek = d_peek_char (di);
1050 if (peek == 'G' || peek == 'T')
1051 return d_special_name (di);
1052 else
1054 struct demangle_component *dc;
1056 dc = d_name (di);
1058 if (dc != NULL && top_level && (di->options & DMGL_PARAMS) == 0)
1060 /* Strip off any initial CV-qualifiers, as they really apply
1061 to the `this' parameter, and they were not output by the
1062 v2 demangler without DMGL_PARAMS. */
1063 while (dc->type == DEMANGLE_COMPONENT_RESTRICT_THIS
1064 || dc->type == DEMANGLE_COMPONENT_VOLATILE_THIS
1065 || dc->type == DEMANGLE_COMPONENT_CONST_THIS)
1066 dc = d_left (dc);
1068 /* If the top level is a DEMANGLE_COMPONENT_LOCAL_NAME, then
1069 there may be CV-qualifiers on its right argument which
1070 really apply here; this happens when parsing a class
1071 which is local to a function. */
1072 if (dc->type == DEMANGLE_COMPONENT_LOCAL_NAME)
1074 struct demangle_component *dcr;
1076 dcr = d_right (dc);
1077 while (dcr->type == DEMANGLE_COMPONENT_RESTRICT_THIS
1078 || dcr->type == DEMANGLE_COMPONENT_VOLATILE_THIS
1079 || dcr->type == DEMANGLE_COMPONENT_CONST_THIS)
1080 dcr = d_left (dcr);
1081 dc->u.s_binary.right = dcr;
1084 return dc;
1087 peek = d_peek_char (di);
1088 if (peek == '\0' || peek == 'E')
1089 return dc;
1090 return d_make_comp (di, DEMANGLE_COMPONENT_TYPED_NAME, dc,
1091 d_bare_function_type (di, has_return_type (dc)));
1095 /* <name> ::= <nested-name>
1096 ::= <unscoped-name>
1097 ::= <unscoped-template-name> <template-args>
1098 ::= <local-name>
1100 <unscoped-name> ::= <unqualified-name>
1101 ::= St <unqualified-name>
1103 <unscoped-template-name> ::= <unscoped-name>
1104 ::= <substitution>
1107 static struct demangle_component *
1108 d_name (di)
1109 struct d_info *di;
1111 char peek = d_peek_char (di);
1112 struct demangle_component *dc;
1114 switch (peek)
1116 case 'N':
1117 return d_nested_name (di);
1119 case 'Z':
1120 return d_local_name (di);
1122 case 'S':
1124 int subst;
1126 if (d_peek_next_char (di) != 't')
1128 dc = d_substitution (di, 0);
1129 subst = 1;
1131 else
1133 d_advance (di, 2);
1134 dc = d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME,
1135 d_make_name (di, "std", 3),
1136 d_unqualified_name (di));
1137 di->expansion += 3;
1138 subst = 0;
1141 if (d_peek_char (di) != 'I')
1143 /* The grammar does not permit this case to occur if we
1144 called d_substitution() above (i.e., subst == 1). We
1145 don't bother to check. */
1147 else
1149 /* This is <template-args>, which means that we just saw
1150 <unscoped-template-name>, which is a substitution
1151 candidate if we didn't just get it from a
1152 substitution. */
1153 if (! subst)
1155 if (! d_add_substitution (di, dc))
1156 return NULL;
1158 dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc,
1159 d_template_args (di));
1162 return dc;
1165 default:
1166 dc = d_unqualified_name (di);
1167 if (d_peek_char (di) == 'I')
1169 /* This is <template-args>, which means that we just saw
1170 <unscoped-template-name>, which is a substitution
1171 candidate. */
1172 if (! d_add_substitution (di, dc))
1173 return NULL;
1174 dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc,
1175 d_template_args (di));
1177 return dc;
1181 /* <nested-name> ::= N [<CV-qualifiers>] <prefix> <unqualified-name> E
1182 ::= N [<CV-qualifiers>] <template-prefix> <template-args> E
1185 static struct demangle_component *
1186 d_nested_name (di)
1187 struct d_info *di;
1189 struct demangle_component *ret;
1190 struct demangle_component **pret;
1192 if (d_next_char (di) != 'N')
1193 return NULL;
1195 pret = d_cv_qualifiers (di, &ret, 1);
1196 if (pret == NULL)
1197 return NULL;
1199 *pret = d_prefix (di);
1200 if (*pret == NULL)
1201 return NULL;
1203 if (d_next_char (di) != 'E')
1204 return NULL;
1206 return ret;
1209 /* <prefix> ::= <prefix> <unqualified-name>
1210 ::= <template-prefix> <template-args>
1211 ::= <template-param>
1213 ::= <substitution>
1215 <template-prefix> ::= <prefix> <(template) unqualified-name>
1216 ::= <template-param>
1217 ::= <substitution>
1220 static struct demangle_component *
1221 d_prefix (di)
1222 struct d_info *di;
1224 struct demangle_component *ret = NULL;
1226 while (1)
1228 char peek;
1229 enum demangle_component_type comb_type;
1230 struct demangle_component *dc;
1232 peek = d_peek_char (di);
1233 if (peek == '\0')
1234 return NULL;
1236 /* The older code accepts a <local-name> here, but I don't see
1237 that in the grammar. The older code does not accept a
1238 <template-param> here. */
1240 comb_type = DEMANGLE_COMPONENT_QUAL_NAME;
1241 if (IS_DIGIT (peek)
1242 || IS_LOWER (peek)
1243 || peek == 'C'
1244 || peek == 'D')
1245 dc = d_unqualified_name (di);
1246 else if (peek == 'S')
1247 dc = d_substitution (di, 1);
1248 else if (peek == 'I')
1250 if (ret == NULL)
1251 return NULL;
1252 comb_type = DEMANGLE_COMPONENT_TEMPLATE;
1253 dc = d_template_args (di);
1255 else if (peek == 'T')
1256 dc = d_template_param (di);
1257 else if (peek == 'E')
1258 return ret;
1259 else
1260 return NULL;
1262 if (ret == NULL)
1263 ret = dc;
1264 else
1265 ret = d_make_comp (di, comb_type, ret, dc);
1267 if (peek != 'S' && d_peek_char (di) != 'E')
1269 if (! d_add_substitution (di, ret))
1270 return NULL;
1275 /* <unqualified-name> ::= <operator-name>
1276 ::= <ctor-dtor-name>
1277 ::= <source-name>
1280 static struct demangle_component *
1281 d_unqualified_name (di)
1282 struct d_info *di;
1284 char peek;
1286 peek = d_peek_char (di);
1287 if (IS_DIGIT (peek))
1288 return d_source_name (di);
1289 else if (IS_LOWER (peek))
1291 struct demangle_component *ret;
1293 ret = d_operator_name (di);
1294 if (ret != NULL && ret->type == DEMANGLE_COMPONENT_OPERATOR)
1295 di->expansion += sizeof "operator" + ret->u.s_operator.op->len - 2;
1296 return ret;
1298 else if (peek == 'C' || peek == 'D')
1299 return d_ctor_dtor_name (di);
1300 else
1301 return NULL;
1304 /* <source-name> ::= <(positive length) number> <identifier> */
1306 static struct demangle_component *
1307 d_source_name (di)
1308 struct d_info *di;
1310 long len;
1311 struct demangle_component *ret;
1313 len = d_number (di);
1314 if (len <= 0)
1315 return NULL;
1316 ret = d_identifier (di, len);
1317 di->last_name = ret;
1318 return ret;
1321 /* number ::= [n] <(non-negative decimal integer)> */
1323 static long
1324 d_number (di)
1325 struct d_info *di;
1327 int negative;
1328 char peek;
1329 long ret;
1331 negative = 0;
1332 peek = d_peek_char (di);
1333 if (peek == 'n')
1335 negative = 1;
1336 d_advance (di, 1);
1337 peek = d_peek_char (di);
1340 ret = 0;
1341 while (1)
1343 if (! IS_DIGIT (peek))
1345 if (negative)
1346 ret = - ret;
1347 return ret;
1349 ret = ret * 10 + peek - '0';
1350 d_advance (di, 1);
1351 peek = d_peek_char (di);
1355 /* identifier ::= <(unqualified source code identifier)> */
1357 static struct demangle_component *
1358 d_identifier (di, len)
1359 struct d_info *di;
1360 int len;
1362 const char *name;
1364 name = d_str (di);
1366 if (di->send - name < len)
1367 return NULL;
1369 d_advance (di, len);
1371 /* A Java mangled name may have a trailing '$' if it is a C++
1372 keyword. This '$' is not included in the length count. We just
1373 ignore the '$'. */
1374 if ((di->options & DMGL_JAVA) != 0
1375 && d_peek_char (di) == '$')
1376 d_advance (di, 1);
1378 /* Look for something which looks like a gcc encoding of an
1379 anonymous namespace, and replace it with a more user friendly
1380 name. */
1381 if (len >= (int) ANONYMOUS_NAMESPACE_PREFIX_LEN + 2
1382 && memcmp (name, ANONYMOUS_NAMESPACE_PREFIX,
1383 ANONYMOUS_NAMESPACE_PREFIX_LEN) == 0)
1385 const char *s;
1387 s = name + ANONYMOUS_NAMESPACE_PREFIX_LEN;
1388 if ((*s == '.' || *s == '_' || *s == '$')
1389 && s[1] == 'N')
1391 di->expansion -= len - sizeof "(anonymous namespace)";
1392 return d_make_name (di, "(anonymous namespace)",
1393 sizeof "(anonymous namespace)" - 1);
1397 return d_make_name (di, name, len);
1400 /* operator_name ::= many different two character encodings.
1401 ::= cv <type>
1402 ::= v <digit> <source-name>
1405 #define NL(s) s, (sizeof s) - 1
1407 CP_STATIC_IF_GLIBCPP_V3
1408 const struct demangle_operator_info cplus_demangle_operators[] =
1410 { "aN", NL ("&="), 2 },
1411 { "aS", NL ("="), 2 },
1412 { "aa", NL ("&&"), 2 },
1413 { "ad", NL ("&"), 1 },
1414 { "an", NL ("&"), 2 },
1415 { "cl", NL ("()"), 0 },
1416 { "cm", NL (","), 2 },
1417 { "co", NL ("~"), 1 },
1418 { "dV", NL ("/="), 2 },
1419 { "da", NL ("delete[]"), 1 },
1420 { "de", NL ("*"), 1 },
1421 { "dl", NL ("delete"), 1 },
1422 { "dv", NL ("/"), 2 },
1423 { "eO", NL ("^="), 2 },
1424 { "eo", NL ("^"), 2 },
1425 { "eq", NL ("=="), 2 },
1426 { "ge", NL (">="), 2 },
1427 { "gt", NL (">"), 2 },
1428 { "ix", NL ("[]"), 2 },
1429 { "lS", NL ("<<="), 2 },
1430 { "le", NL ("<="), 2 },
1431 { "ls", NL ("<<"), 2 },
1432 { "lt", NL ("<"), 2 },
1433 { "mI", NL ("-="), 2 },
1434 { "mL", NL ("*="), 2 },
1435 { "mi", NL ("-"), 2 },
1436 { "ml", NL ("*"), 2 },
1437 { "mm", NL ("--"), 1 },
1438 { "na", NL ("new[]"), 1 },
1439 { "ne", NL ("!="), 2 },
1440 { "ng", NL ("-"), 1 },
1441 { "nt", NL ("!"), 1 },
1442 { "nw", NL ("new"), 1 },
1443 { "oR", NL ("|="), 2 },
1444 { "oo", NL ("||"), 2 },
1445 { "or", NL ("|"), 2 },
1446 { "pL", NL ("+="), 2 },
1447 { "pl", NL ("+"), 2 },
1448 { "pm", NL ("->*"), 2 },
1449 { "pp", NL ("++"), 1 },
1450 { "ps", NL ("+"), 1 },
1451 { "pt", NL ("->"), 2 },
1452 { "qu", NL ("?"), 3 },
1453 { "rM", NL ("%="), 2 },
1454 { "rS", NL (">>="), 2 },
1455 { "rm", NL ("%"), 2 },
1456 { "rs", NL (">>"), 2 },
1457 { "st", NL ("sizeof "), 1 },
1458 { "sz", NL ("sizeof "), 1 },
1459 { NULL, NULL, 0, 0 }
1462 static struct demangle_component *
1463 d_operator_name (di)
1464 struct d_info *di;
1466 char c1;
1467 char c2;
1469 c1 = d_next_char (di);
1470 c2 = d_next_char (di);
1471 if (c1 == 'v' && IS_DIGIT (c2))
1472 return d_make_extended_operator (di, c2 - '0', d_source_name (di));
1473 else if (c1 == 'c' && c2 == 'v')
1474 return d_make_comp (di, DEMANGLE_COMPONENT_CAST,
1475 cplus_demangle_type (di), NULL);
1476 else
1478 /* LOW is the inclusive lower bound. */
1479 int low = 0;
1480 /* HIGH is the exclusive upper bound. We subtract one to ignore
1481 the sentinel at the end of the array. */
1482 int high = ((sizeof (cplus_demangle_operators)
1483 / sizeof (cplus_demangle_operators[0]))
1484 - 1);
1486 while (1)
1488 int i;
1489 const struct demangle_operator_info *p;
1491 i = low + (high - low) / 2;
1492 p = cplus_demangle_operators + i;
1494 if (c1 == p->code[0] && c2 == p->code[1])
1495 return d_make_operator (di, p);
1497 if (c1 < p->code[0] || (c1 == p->code[0] && c2 < p->code[1]))
1498 high = i;
1499 else
1500 low = i + 1;
1501 if (low == high)
1502 return NULL;
1507 /* <special-name> ::= TV <type>
1508 ::= TT <type>
1509 ::= TI <type>
1510 ::= TS <type>
1511 ::= GV <(object) name>
1512 ::= T <call-offset> <(base) encoding>
1513 ::= Tc <call-offset> <call-offset> <(base) encoding>
1514 Also g++ extensions:
1515 ::= TC <type> <(offset) number> _ <(base) type>
1516 ::= TF <type>
1517 ::= TJ <type>
1518 ::= GR <name>
1521 static struct demangle_component *
1522 d_special_name (di)
1523 struct d_info *di;
1525 char c;
1527 di->expansion += 20;
1528 c = d_next_char (di);
1529 if (c == 'T')
1531 switch (d_next_char (di))
1533 case 'V':
1534 di->expansion -= 5;
1535 return d_make_comp (di, DEMANGLE_COMPONENT_VTABLE,
1536 cplus_demangle_type (di), NULL);
1537 case 'T':
1538 di->expansion -= 10;
1539 return d_make_comp (di, DEMANGLE_COMPONENT_VTT,
1540 cplus_demangle_type (di), NULL);
1541 case 'I':
1542 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO,
1543 cplus_demangle_type (di), NULL);
1544 case 'S':
1545 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_NAME,
1546 cplus_demangle_type (di), NULL);
1548 case 'h':
1549 if (! d_call_offset (di, 'h'))
1550 return NULL;
1551 return d_make_comp (di, DEMANGLE_COMPONENT_THUNK,
1552 d_encoding (di, 0), NULL);
1554 case 'v':
1555 if (! d_call_offset (di, 'v'))
1556 return NULL;
1557 return d_make_comp (di, DEMANGLE_COMPONENT_VIRTUAL_THUNK,
1558 d_encoding (di, 0), NULL);
1560 case 'c':
1561 if (! d_call_offset (di, '\0'))
1562 return NULL;
1563 if (! d_call_offset (di, '\0'))
1564 return NULL;
1565 return d_make_comp (di, DEMANGLE_COMPONENT_COVARIANT_THUNK,
1566 d_encoding (di, 0), NULL);
1568 case 'C':
1570 struct demangle_component *derived_type;
1571 long offset;
1572 struct demangle_component *base_type;
1574 derived_type = cplus_demangle_type (di);
1575 offset = d_number (di);
1576 if (offset < 0)
1577 return NULL;
1578 if (d_next_char (di) != '_')
1579 return NULL;
1580 base_type = cplus_demangle_type (di);
1581 /* We don't display the offset. FIXME: We should display
1582 it in verbose mode. */
1583 di->expansion += 5;
1584 return d_make_comp (di, DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE,
1585 base_type, derived_type);
1588 case 'F':
1589 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_FN,
1590 cplus_demangle_type (di), NULL);
1591 case 'J':
1592 return d_make_comp (di, DEMANGLE_COMPONENT_JAVA_CLASS,
1593 cplus_demangle_type (di), NULL);
1595 default:
1596 return NULL;
1599 else if (c == 'G')
1601 switch (d_next_char (di))
1603 case 'V':
1604 return d_make_comp (di, DEMANGLE_COMPONENT_GUARD, d_name (di), NULL);
1606 case 'R':
1607 return d_make_comp (di, DEMANGLE_COMPONENT_REFTEMP, d_name (di),
1608 NULL);
1610 default:
1611 return NULL;
1614 else
1615 return NULL;
1618 /* <call-offset> ::= h <nv-offset> _
1619 ::= v <v-offset> _
1621 <nv-offset> ::= <(offset) number>
1623 <v-offset> ::= <(offset) number> _ <(virtual offset) number>
1625 The C parameter, if not '\0', is a character we just read which is
1626 the start of the <call-offset>.
1628 We don't display the offset information anywhere. FIXME: We should
1629 display it in verbose mode. */
1631 static int
1632 d_call_offset (di, c)
1633 struct d_info *di;
1634 int c;
1636 long offset;
1637 long virtual_offset;
1639 if (c == '\0')
1640 c = d_next_char (di);
1642 if (c == 'h')
1643 offset = d_number (di);
1644 else if (c == 'v')
1646 offset = d_number (di);
1647 if (d_next_char (di) != '_')
1648 return 0;
1649 virtual_offset = d_number (di);
1651 else
1652 return 0;
1654 if (d_next_char (di) != '_')
1655 return 0;
1657 return 1;
1660 /* <ctor-dtor-name> ::= C1
1661 ::= C2
1662 ::= C3
1663 ::= D0
1664 ::= D1
1665 ::= D2
1668 static struct demangle_component *
1669 d_ctor_dtor_name (di)
1670 struct d_info *di;
1672 if (di->last_name != NULL)
1674 if (di->last_name->type == DEMANGLE_COMPONENT_NAME)
1675 di->expansion += di->last_name->u.s_name.len;
1676 else if (di->last_name->type == DEMANGLE_COMPONENT_SUB_STD)
1677 di->expansion += di->last_name->u.s_string.len;
1679 switch (d_next_char (di))
1681 case 'C':
1683 enum gnu_v3_ctor_kinds kind;
1685 switch (d_next_char (di))
1687 case '1':
1688 kind = gnu_v3_complete_object_ctor;
1689 break;
1690 case '2':
1691 kind = gnu_v3_base_object_ctor;
1692 break;
1693 case '3':
1694 kind = gnu_v3_complete_object_allocating_ctor;
1695 break;
1696 default:
1697 return NULL;
1699 return d_make_ctor (di, kind, di->last_name);
1702 case 'D':
1704 enum gnu_v3_dtor_kinds kind;
1706 switch (d_next_char (di))
1708 case '0':
1709 kind = gnu_v3_deleting_dtor;
1710 break;
1711 case '1':
1712 kind = gnu_v3_complete_object_dtor;
1713 break;
1714 case '2':
1715 kind = gnu_v3_base_object_dtor;
1716 break;
1717 default:
1718 return NULL;
1720 return d_make_dtor (di, kind, di->last_name);
1723 default:
1724 return NULL;
1728 /* <type> ::= <builtin-type>
1729 ::= <function-type>
1730 ::= <class-enum-type>
1731 ::= <array-type>
1732 ::= <pointer-to-member-type>
1733 ::= <template-param>
1734 ::= <template-template-param> <template-args>
1735 ::= <substitution>
1736 ::= <CV-qualifiers> <type>
1737 ::= P <type>
1738 ::= R <type>
1739 ::= C <type>
1740 ::= G <type>
1741 ::= U <source-name> <type>
1743 <builtin-type> ::= various one letter codes
1744 ::= u <source-name>
1747 CP_STATIC_IF_GLIBCPP_V3
1748 const struct demangle_builtin_type_info
1749 cplus_demangle_builtin_types[D_BUILTIN_TYPE_COUNT] =
1751 /* a */ { NL ("signed char"), NL ("signed char"), D_PRINT_DEFAULT },
1752 /* b */ { NL ("bool"), NL ("boolean"), D_PRINT_BOOL },
1753 /* c */ { NL ("char"), NL ("byte"), D_PRINT_DEFAULT },
1754 /* d */ { NL ("double"), NL ("double"), D_PRINT_FLOAT },
1755 /* e */ { NL ("long double"), NL ("long double"), D_PRINT_FLOAT },
1756 /* f */ { NL ("float"), NL ("float"), D_PRINT_FLOAT },
1757 /* g */ { NL ("__float128"), NL ("__float128"), D_PRINT_FLOAT },
1758 /* h */ { NL ("unsigned char"), NL ("unsigned char"), D_PRINT_DEFAULT },
1759 /* i */ { NL ("int"), NL ("int"), D_PRINT_INT },
1760 /* j */ { NL ("unsigned int"), NL ("unsigned"), D_PRINT_UNSIGNED },
1761 /* k */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
1762 /* l */ { NL ("long"), NL ("long"), D_PRINT_LONG },
1763 /* m */ { NL ("unsigned long"), NL ("unsigned long"), D_PRINT_UNSIGNED_LONG },
1764 /* n */ { NL ("__int128"), NL ("__int128"), D_PRINT_DEFAULT },
1765 /* o */ { NL ("unsigned __int128"), NL ("unsigned __int128"),
1766 D_PRINT_DEFAULT },
1767 /* p */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
1768 /* q */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
1769 /* r */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
1770 /* s */ { NL ("short"), NL ("short"), D_PRINT_DEFAULT },
1771 /* t */ { NL ("unsigned short"), NL ("unsigned short"), D_PRINT_DEFAULT },
1772 /* u */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
1773 /* v */ { NL ("void"), NL ("void"), D_PRINT_VOID },
1774 /* w */ { NL ("wchar_t"), NL ("char"), D_PRINT_DEFAULT },
1775 /* x */ { NL ("long long"), NL ("long"), D_PRINT_LONG_LONG },
1776 /* y */ { NL ("unsigned long long"), NL ("unsigned long long"),
1777 D_PRINT_UNSIGNED_LONG_LONG },
1778 /* z */ { NL ("..."), NL ("..."), D_PRINT_DEFAULT },
1781 CP_STATIC_IF_GLIBCPP_V3
1782 struct demangle_component *
1783 cplus_demangle_type (di)
1784 struct d_info *di;
1786 char peek;
1787 struct demangle_component *ret;
1788 int can_subst;
1790 /* The ABI specifies that when CV-qualifiers are used, the base type
1791 is substitutable, and the fully qualified type is substitutable,
1792 but the base type with a strict subset of the CV-qualifiers is
1793 not substitutable. The natural recursive implementation of the
1794 CV-qualifiers would cause subsets to be substitutable, so instead
1795 we pull them all off now.
1797 FIXME: The ABI says that order-insensitive vendor qualifiers
1798 should be handled in the same way, but we have no way to tell
1799 which vendor qualifiers are order-insensitive and which are
1800 order-sensitive. So we just assume that they are all
1801 order-sensitive. g++ 3.4 supports only one vendor qualifier,
1802 __vector, and it treats it as order-sensitive when mangling
1803 names. */
1805 peek = d_peek_char (di);
1806 if (peek == 'r' || peek == 'V' || peek == 'K')
1808 struct demangle_component **pret;
1810 pret = d_cv_qualifiers (di, &ret, 0);
1811 if (pret == NULL)
1812 return NULL;
1813 *pret = cplus_demangle_type (di);
1814 if (! d_add_substitution (di, ret))
1815 return NULL;
1816 return ret;
1819 can_subst = 1;
1821 switch (peek)
1823 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
1824 case 'h': case 'i': case 'j': case 'l': case 'm': case 'n':
1825 case 'o': case 's': case 't':
1826 case 'v': case 'w': case 'x': case 'y': case 'z':
1827 ret = d_make_builtin_type (di,
1828 &cplus_demangle_builtin_types[peek - 'a']);
1829 di->expansion += ret->u.s_builtin.type->len;
1830 can_subst = 0;
1831 d_advance (di, 1);
1832 break;
1834 case 'u':
1835 d_advance (di, 1);
1836 ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE,
1837 d_source_name (di), NULL);
1838 break;
1840 case 'F':
1841 ret = d_function_type (di);
1842 break;
1844 case '0': case '1': case '2': case '3': case '4':
1845 case '5': case '6': case '7': case '8': case '9':
1846 case 'N':
1847 case 'Z':
1848 ret = d_class_enum_type (di);
1849 break;
1851 case 'A':
1852 ret = d_array_type (di);
1853 break;
1855 case 'M':
1856 ret = d_pointer_to_member_type (di);
1857 break;
1859 case 'T':
1860 ret = d_template_param (di);
1861 if (d_peek_char (di) == 'I')
1863 /* This is <template-template-param> <template-args>. The
1864 <template-template-param> part is a substitution
1865 candidate. */
1866 if (! d_add_substitution (di, ret))
1867 return NULL;
1868 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
1869 d_template_args (di));
1871 break;
1873 case 'S':
1874 /* If this is a special substitution, then it is the start of
1875 <class-enum-type>. */
1877 char peek_next;
1879 peek_next = d_peek_next_char (di);
1880 if (IS_DIGIT (peek_next)
1881 || peek_next == '_'
1882 || IS_UPPER (peek_next))
1884 ret = d_substitution (di, 0);
1885 /* The substituted name may have been a template name and
1886 may be followed by tepmlate args. */
1887 if (d_peek_char (di) == 'I')
1888 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
1889 d_template_args (di));
1890 else
1891 can_subst = 0;
1893 else
1895 ret = d_class_enum_type (di);
1896 /* If the substitution was a complete type, then it is not
1897 a new substitution candidate. However, if the
1898 substitution was followed by template arguments, then
1899 the whole thing is a substitution candidate. */
1900 if (ret != NULL && ret->type == DEMANGLE_COMPONENT_SUB_STD)
1901 can_subst = 0;
1904 break;
1906 case 'P':
1907 d_advance (di, 1);
1908 ret = d_make_comp (di, DEMANGLE_COMPONENT_POINTER,
1909 cplus_demangle_type (di), NULL);
1910 break;
1912 case 'R':
1913 d_advance (di, 1);
1914 ret = d_make_comp (di, DEMANGLE_COMPONENT_REFERENCE,
1915 cplus_demangle_type (di), NULL);
1916 break;
1918 case 'C':
1919 d_advance (di, 1);
1920 ret = d_make_comp (di, DEMANGLE_COMPONENT_COMPLEX,
1921 cplus_demangle_type (di), NULL);
1922 break;
1924 case 'G':
1925 d_advance (di, 1);
1926 ret = d_make_comp (di, DEMANGLE_COMPONENT_IMAGINARY,
1927 cplus_demangle_type (di), NULL);
1928 break;
1930 case 'U':
1931 d_advance (di, 1);
1932 ret = d_source_name (di);
1933 ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL,
1934 cplus_demangle_type (di), ret);
1935 break;
1937 default:
1938 return NULL;
1941 if (can_subst)
1943 if (! d_add_substitution (di, ret))
1944 return NULL;
1947 return ret;
1950 /* <CV-qualifiers> ::= [r] [V] [K] */
1952 static struct demangle_component **
1953 d_cv_qualifiers (di, pret, member_fn)
1954 struct d_info *di;
1955 struct demangle_component **pret;
1956 int member_fn;
1958 char peek;
1960 peek = d_peek_char (di);
1961 while (peek == 'r' || peek == 'V' || peek == 'K')
1963 enum demangle_component_type t;
1965 d_advance (di, 1);
1966 if (peek == 'r')
1968 t = (member_fn
1969 ? DEMANGLE_COMPONENT_RESTRICT_THIS
1970 : DEMANGLE_COMPONENT_RESTRICT);
1971 di->expansion += sizeof "restrict";
1973 else if (peek == 'V')
1975 t = (member_fn
1976 ? DEMANGLE_COMPONENT_VOLATILE_THIS
1977 : DEMANGLE_COMPONENT_VOLATILE);
1978 di->expansion += sizeof "volatile";
1980 else
1982 t = (member_fn
1983 ? DEMANGLE_COMPONENT_CONST_THIS
1984 : DEMANGLE_COMPONENT_CONST);
1985 di->expansion += sizeof "const";
1988 *pret = d_make_comp (di, t, NULL, NULL);
1989 if (*pret == NULL)
1990 return NULL;
1991 pret = &d_left (*pret);
1993 peek = d_peek_char (di);
1996 return pret;
1999 /* <function-type> ::= F [Y] <bare-function-type> E */
2001 static struct demangle_component *
2002 d_function_type (di)
2003 struct d_info *di;
2005 struct demangle_component *ret;
2007 if (d_next_char (di) != 'F')
2008 return NULL;
2009 if (d_peek_char (di) == 'Y')
2011 /* Function has C linkage. We don't print this information.
2012 FIXME: We should print it in verbose mode. */
2013 d_advance (di, 1);
2015 ret = d_bare_function_type (di, 1);
2016 if (d_next_char (di) != 'E')
2017 return NULL;
2018 return ret;
2021 /* <bare-function-type> ::= <type>+ */
2023 static struct demangle_component *
2024 d_bare_function_type (di, has_return_type)
2025 struct d_info *di;
2026 int has_return_type;
2028 struct demangle_component *return_type;
2029 struct demangle_component *tl;
2030 struct demangle_component **ptl;
2032 return_type = NULL;
2033 tl = NULL;
2034 ptl = &tl;
2035 while (1)
2037 char peek;
2038 struct demangle_component *type;
2040 peek = d_peek_char (di);
2041 if (peek == '\0' || peek == 'E')
2042 break;
2043 type = cplus_demangle_type (di);
2044 if (type == NULL)
2045 return NULL;
2046 if (has_return_type)
2048 return_type = type;
2049 has_return_type = 0;
2051 else
2053 *ptl = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, type, NULL);
2054 if (*ptl == NULL)
2055 return NULL;
2056 ptl = &d_right (*ptl);
2060 /* There should be at least one parameter type besides the optional
2061 return type. A function which takes no arguments will have a
2062 single parameter type void. */
2063 if (tl == NULL)
2064 return NULL;
2066 /* If we have a single parameter type void, omit it. */
2067 if (d_right (tl) == NULL
2068 && d_left (tl)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
2069 && d_left (tl)->u.s_builtin.type->print == D_PRINT_VOID)
2071 di->expansion -= d_left (tl)->u.s_builtin.type->len;
2072 tl = NULL;
2075 return d_make_comp (di, DEMANGLE_COMPONENT_FUNCTION_TYPE, return_type, tl);
2078 /* <class-enum-type> ::= <name> */
2080 static struct demangle_component *
2081 d_class_enum_type (di)
2082 struct d_info *di;
2084 return d_name (di);
2087 /* <array-type> ::= A <(positive dimension) number> _ <(element) type>
2088 ::= A [<(dimension) expression>] _ <(element) type>
2091 static struct demangle_component *
2092 d_array_type (di)
2093 struct d_info *di;
2095 char peek;
2096 struct demangle_component *dim;
2098 if (d_next_char (di) != 'A')
2099 return NULL;
2101 peek = d_peek_char (di);
2102 if (peek == '_')
2103 dim = NULL;
2104 else if (IS_DIGIT (peek))
2106 const char *s;
2108 s = d_str (di);
2111 d_advance (di, 1);
2112 peek = d_peek_char (di);
2114 while (IS_DIGIT (peek));
2115 dim = d_make_name (di, s, d_str (di) - s);
2116 if (dim == NULL)
2117 return NULL;
2119 else
2121 dim = d_expression (di);
2122 if (dim == NULL)
2123 return NULL;
2126 if (d_next_char (di) != '_')
2127 return NULL;
2129 return d_make_comp (di, DEMANGLE_COMPONENT_ARRAY_TYPE, dim,
2130 cplus_demangle_type (di));
2133 /* <pointer-to-member-type> ::= M <(class) type> <(member) type> */
2135 static struct demangle_component *
2136 d_pointer_to_member_type (di)
2137 struct d_info *di;
2139 struct demangle_component *cl;
2140 struct demangle_component *mem;
2141 struct demangle_component **pmem;
2143 if (d_next_char (di) != 'M')
2144 return NULL;
2146 cl = cplus_demangle_type (di);
2148 /* The ABI specifies that any type can be a substitution source, and
2149 that M is followed by two types, and that when a CV-qualified
2150 type is seen both the base type and the CV-qualified types are
2151 substitution sources. The ABI also specifies that for a pointer
2152 to a CV-qualified member function, the qualifiers are attached to
2153 the second type. Given the grammar, a plain reading of the ABI
2154 suggests that both the CV-qualified member function and the
2155 non-qualified member function are substitution sources. However,
2156 g++ does not work that way. g++ treats only the CV-qualified
2157 member function as a substitution source. FIXME. So to work
2158 with g++, we need to pull off the CV-qualifiers here, in order to
2159 avoid calling add_substitution() in cplus_demangle_type(). */
2161 pmem = d_cv_qualifiers (di, &mem, 1);
2162 if (pmem == NULL)
2163 return NULL;
2164 *pmem = cplus_demangle_type (di);
2166 return d_make_comp (di, DEMANGLE_COMPONENT_PTRMEM_TYPE, cl, mem);
2169 /* <template-param> ::= T_
2170 ::= T <(parameter-2 non-negative) number> _
2173 static struct demangle_component *
2174 d_template_param (di)
2175 struct d_info *di;
2177 long param;
2179 if (d_next_char (di) != 'T')
2180 return NULL;
2182 if (d_peek_char (di) == '_')
2183 param = 0;
2184 else
2186 param = d_number (di);
2187 if (param < 0)
2188 return NULL;
2189 param += 1;
2192 if (d_next_char (di) != '_')
2193 return NULL;
2195 ++di->did_subs;
2197 return d_make_template_param (di, param);
2200 /* <template-args> ::= I <template-arg>+ E */
2202 static struct demangle_component *
2203 d_template_args (di)
2204 struct d_info *di;
2206 struct demangle_component *hold_last_name;
2207 struct demangle_component *al;
2208 struct demangle_component **pal;
2210 /* Preserve the last name we saw--don't let the template arguments
2211 clobber it, as that would give us the wrong name for a subsequent
2212 constructor or destructor. */
2213 hold_last_name = di->last_name;
2215 if (d_next_char (di) != 'I')
2216 return NULL;
2218 al = NULL;
2219 pal = &al;
2220 while (1)
2222 struct demangle_component *a;
2224 a = d_template_arg (di);
2225 if (a == NULL)
2226 return NULL;
2228 *pal = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, a, NULL);
2229 if (*pal == NULL)
2230 return NULL;
2231 pal = &d_right (*pal);
2233 if (d_peek_char (di) == 'E')
2235 d_advance (di, 1);
2236 break;
2240 di->last_name = hold_last_name;
2242 return al;
2245 /* <template-arg> ::= <type>
2246 ::= X <expression> E
2247 ::= <expr-primary>
2250 static struct demangle_component *
2251 d_template_arg (di)
2252 struct d_info *di;
2254 struct demangle_component *ret;
2256 switch (d_peek_char (di))
2258 case 'X':
2259 d_advance (di, 1);
2260 ret = d_expression (di);
2261 if (d_next_char (di) != 'E')
2262 return NULL;
2263 return ret;
2265 case 'L':
2266 return d_expr_primary (di);
2268 default:
2269 return cplus_demangle_type (di);
2273 /* <expression> ::= <(unary) operator-name> <expression>
2274 ::= <(binary) operator-name> <expression> <expression>
2275 ::= <(trinary) operator-name> <expression> <expression> <expression>
2276 ::= st <type>
2277 ::= <template-param>
2278 ::= sr <type> <unqualified-name>
2279 ::= sr <type> <unqualified-name> <template-args>
2280 ::= <expr-primary>
2283 static struct demangle_component *
2284 d_expression (di)
2285 struct d_info *di;
2287 char peek;
2289 peek = d_peek_char (di);
2290 if (peek == 'L')
2291 return d_expr_primary (di);
2292 else if (peek == 'T')
2293 return d_template_param (di);
2294 else if (peek == 's' && d_peek_next_char (di) == 'r')
2296 struct demangle_component *type;
2297 struct demangle_component *name;
2299 d_advance (di, 2);
2300 type = cplus_demangle_type (di);
2301 name = d_unqualified_name (di);
2302 if (d_peek_char (di) != 'I')
2303 return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type, name);
2304 else
2305 return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type,
2306 d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
2307 d_template_args (di)));
2309 else
2311 struct demangle_component *op;
2312 int args;
2314 op = d_operator_name (di);
2315 if (op == NULL)
2316 return NULL;
2318 if (op->type == DEMANGLE_COMPONENT_OPERATOR)
2319 di->expansion += op->u.s_operator.op->len - 2;
2321 if (op->type == DEMANGLE_COMPONENT_OPERATOR
2322 && strcmp (op->u.s_operator.op->code, "st") == 0)
2323 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
2324 cplus_demangle_type (di));
2326 switch (op->type)
2328 default:
2329 return NULL;
2330 case DEMANGLE_COMPONENT_OPERATOR:
2331 args = op->u.s_operator.op->args;
2332 break;
2333 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
2334 args = op->u.s_extended_operator.args;
2335 break;
2336 case DEMANGLE_COMPONENT_CAST:
2337 args = 1;
2338 break;
2341 switch (args)
2343 case 1:
2344 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
2345 d_expression (di));
2346 case 2:
2348 struct demangle_component *left;
2350 left = d_expression (di);
2351 return d_make_comp (di, DEMANGLE_COMPONENT_BINARY, op,
2352 d_make_comp (di,
2353 DEMANGLE_COMPONENT_BINARY_ARGS,
2354 left,
2355 d_expression (di)));
2357 case 3:
2359 struct demangle_component *first;
2360 struct demangle_component *second;
2362 first = d_expression (di);
2363 second = d_expression (di);
2364 return d_make_comp (di, DEMANGLE_COMPONENT_TRINARY, op,
2365 d_make_comp (di,
2366 DEMANGLE_COMPONENT_TRINARY_ARG1,
2367 first,
2368 d_make_comp (di,
2369 DEMANGLE_COMPONENT_TRINARY_ARG2,
2370 second,
2371 d_expression (di))));
2373 default:
2374 return NULL;
2379 /* <expr-primary> ::= L <type> <(value) number> E
2380 ::= L <type> <(value) float> E
2381 ::= L <mangled-name> E
2384 static struct demangle_component *
2385 d_expr_primary (di)
2386 struct d_info *di;
2388 struct demangle_component *ret;
2390 if (d_next_char (di) != 'L')
2391 return NULL;
2392 if (d_peek_char (di) == '_')
2393 ret = cplus_demangle_mangled_name (di, 0);
2394 else
2396 struct demangle_component *type;
2397 enum demangle_component_type t;
2398 const char *s;
2400 type = cplus_demangle_type (di);
2401 if (type == NULL)
2402 return NULL;
2404 /* If we have a type we know how to print, we aren't going to
2405 print the type name itself. */
2406 if (type->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
2407 && type->u.s_builtin.type->print != D_PRINT_DEFAULT)
2408 di->expansion -= type->u.s_builtin.type->len;
2410 /* Rather than try to interpret the literal value, we just
2411 collect it as a string. Note that it's possible to have a
2412 floating point literal here. The ABI specifies that the
2413 format of such literals is machine independent. That's fine,
2414 but what's not fine is that versions of g++ up to 3.2 with
2415 -fabi-version=1 used upper case letters in the hex constant,
2416 and dumped out gcc's internal representation. That makes it
2417 hard to tell where the constant ends, and hard to dump the
2418 constant in any readable form anyhow. We don't attempt to
2419 handle these cases. */
2421 t = DEMANGLE_COMPONENT_LITERAL;
2422 if (d_peek_char (di) == 'n')
2424 t = DEMANGLE_COMPONENT_LITERAL_NEG;
2425 d_advance (di, 1);
2427 s = d_str (di);
2428 while (d_peek_char (di) != 'E')
2429 d_advance (di, 1);
2430 ret = d_make_comp (di, t, type, d_make_name (di, s, d_str (di) - s));
2432 if (d_next_char (di) != 'E')
2433 return NULL;
2434 return ret;
2437 /* <local-name> ::= Z <(function) encoding> E <(entity) name> [<discriminator>]
2438 ::= Z <(function) encoding> E s [<discriminator>]
2441 static struct demangle_component *
2442 d_local_name (di)
2443 struct d_info *di;
2445 struct demangle_component *function;
2447 if (d_next_char (di) != 'Z')
2448 return NULL;
2450 function = d_encoding (di, 0);
2452 if (d_next_char (di) != 'E')
2453 return NULL;
2455 if (d_peek_char (di) == 's')
2457 d_advance (di, 1);
2458 if (! d_discriminator (di))
2459 return NULL;
2460 return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function,
2461 d_make_name (di, "string literal",
2462 sizeof "string literal" - 1));
2464 else
2466 struct demangle_component *name;
2468 name = d_name (di);
2469 if (! d_discriminator (di))
2470 return NULL;
2471 return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function, name);
2475 /* <discriminator> ::= _ <(non-negative) number>
2477 We demangle the discriminator, but we don't print it out. FIXME:
2478 We should print it out in verbose mode. */
2480 static int
2481 d_discriminator (di)
2482 struct d_info *di;
2484 long discrim;
2486 if (d_peek_char (di) != '_')
2487 return 1;
2488 d_advance (di, 1);
2489 discrim = d_number (di);
2490 if (discrim < 0)
2491 return 0;
2492 return 1;
2495 /* Add a new substitution. */
2497 static int
2498 d_add_substitution (di, dc)
2499 struct d_info *di;
2500 struct demangle_component *dc;
2502 if (dc == NULL)
2503 return 0;
2504 if (di->next_sub >= di->num_subs)
2505 return 0;
2506 di->subs[di->next_sub] = dc;
2507 ++di->next_sub;
2508 return 1;
2511 /* <substitution> ::= S <seq-id> _
2512 ::= S_
2513 ::= St
2514 ::= Sa
2515 ::= Sb
2516 ::= Ss
2517 ::= Si
2518 ::= So
2519 ::= Sd
2521 If PREFIX is non-zero, then this type is being used as a prefix in
2522 a qualified name. In this case, for the standard substitutions, we
2523 need to check whether we are being used as a prefix for a
2524 constructor or destructor, and return a full template name.
2525 Otherwise we will get something like std::iostream::~iostream()
2526 which does not correspond particularly well to any function which
2527 actually appears in the source.
2530 static const struct d_standard_sub_info standard_subs[] =
2532 { 't', NL ("std"),
2533 NL ("std"),
2534 NULL, 0 },
2535 { 'a', NL ("std::allocator"),
2536 NL ("std::allocator"),
2537 NL ("allocator") },
2538 { 'b', NL ("std::basic_string"),
2539 NL ("std::basic_string"),
2540 NL ("basic_string") },
2541 { 's', NL ("std::string"),
2542 NL ("std::basic_string<char, std::char_traits<char>, std::allocator<char> >"),
2543 NL ("basic_string") },
2544 { 'i', NL ("std::istream"),
2545 NL ("std::basic_istream<char, std::char_traits<char> >"),
2546 NL ("basic_istream") },
2547 { 'o', NL ("std::ostream"),
2548 NL ("std::basic_ostream<char, std::char_traits<char> >"),
2549 NL ("basic_ostream") },
2550 { 'd', NL ("std::iostream"),
2551 NL ("std::basic_iostream<char, std::char_traits<char> >"),
2552 NL ("basic_iostream") }
2555 static struct demangle_component *
2556 d_substitution (di, prefix)
2557 struct d_info *di;
2558 int prefix;
2560 char c;
2562 if (d_next_char (di) != 'S')
2563 return NULL;
2565 c = d_next_char (di);
2566 if (c == '_' || IS_DIGIT (c) || IS_UPPER (c))
2568 int id;
2570 id = 0;
2571 if (c != '_')
2575 if (IS_DIGIT (c))
2576 id = id * 36 + c - '0';
2577 else if (IS_UPPER (c))
2578 id = id * 36 + c - 'A' + 10;
2579 else
2580 return NULL;
2581 c = d_next_char (di);
2583 while (c != '_');
2585 ++id;
2588 if (id >= di->next_sub)
2589 return NULL;
2591 ++di->did_subs;
2593 return di->subs[id];
2595 else
2597 int verbose;
2598 const struct d_standard_sub_info *p;
2599 const struct d_standard_sub_info *pend;
2601 verbose = (di->options & DMGL_VERBOSE) != 0;
2602 if (! verbose && prefix)
2604 char peek;
2606 peek = d_peek_char (di);
2607 if (peek == 'C' || peek == 'D')
2608 verbose = 1;
2611 pend = (&standard_subs[0]
2612 + sizeof standard_subs / sizeof standard_subs[0]);
2613 for (p = &standard_subs[0]; p < pend; ++p)
2615 if (c == p->code)
2617 const char *s;
2618 int len;
2620 if (p->set_last_name != NULL)
2621 di->last_name = d_make_sub (di, p->set_last_name,
2622 p->set_last_name_len);
2623 if (verbose)
2625 s = p->full_expansion;
2626 len = p->full_len;
2628 else
2630 s = p->simple_expansion;
2631 len = p->simple_len;
2633 di->expansion += len;
2634 return d_make_sub (di, s, len);
2638 return NULL;
2642 /* Resize the print buffer. */
2644 static void
2645 d_print_resize (dpi, add)
2646 struct d_print_info *dpi;
2647 size_t add;
2649 size_t need;
2651 if (dpi->buf == NULL)
2652 return;
2653 need = dpi->len + add;
2654 while (need > dpi->alc)
2656 size_t newalc;
2657 char *newbuf;
2659 newalc = dpi->alc * 2;
2660 newbuf = realloc (dpi->buf, newalc);
2661 if (newbuf == NULL)
2663 free (dpi->buf);
2664 dpi->buf = NULL;
2665 dpi->allocation_failure = 1;
2666 return;
2668 dpi->buf = newbuf;
2669 dpi->alc = newalc;
2673 /* Append a character to the print buffer. */
2675 static void
2676 d_print_append_char (dpi, c)
2677 struct d_print_info *dpi;
2678 int c;
2680 if (dpi->buf != NULL)
2682 if (dpi->len >= dpi->alc)
2684 d_print_resize (dpi, 1);
2685 if (dpi->buf == NULL)
2686 return;
2689 dpi->buf[dpi->len] = c;
2690 ++dpi->len;
2694 /* Append a buffer to the print buffer. */
2696 static void
2697 d_print_append_buffer (dpi, s, l)
2698 struct d_print_info *dpi;
2699 const char *s;
2700 size_t l;
2702 if (dpi->buf != NULL)
2704 if (dpi->len + l > dpi->alc)
2706 d_print_resize (dpi, l);
2707 if (dpi->buf == NULL)
2708 return;
2711 memcpy (dpi->buf + dpi->len, s, l);
2712 dpi->len += l;
2716 /* Indicate that an error occurred during printing. */
2718 static void
2719 d_print_error (dpi)
2720 struct d_print_info *dpi;
2722 free (dpi->buf);
2723 dpi->buf = NULL;
2726 /* Turn components into a human readable string. OPTIONS is the
2727 options bits passed to the demangler. DC is the tree to print.
2728 ESTIMATE is a guess at the length of the result. This returns a
2729 string allocated by malloc, or NULL on error. On success, this
2730 sets *PALC to the size of the allocated buffer. On failure, this
2731 sets *PALC to 0 for a bad parse, or to 1 for a memory allocation
2732 failure. */
2734 CP_STATIC_IF_GLIBCPP_V3
2735 char *
2736 cplus_demangle_print (options, dc, estimate, palc)
2737 int options;
2738 const struct demangle_component *dc;
2739 int estimate;
2740 size_t *palc;
2742 struct d_print_info dpi;
2744 dpi.options = options;
2746 dpi.alc = estimate + 1;
2747 dpi.buf = malloc (dpi.alc);
2748 if (dpi.buf == NULL)
2750 *palc = 1;
2751 return NULL;
2754 dpi.len = 0;
2755 dpi.templates = NULL;
2756 dpi.modifiers = NULL;
2758 dpi.allocation_failure = 0;
2760 d_print_comp (&dpi, dc);
2762 d_append_char (&dpi, '\0');
2764 if (dpi.buf != NULL)
2765 *palc = dpi.alc;
2766 else
2767 *palc = dpi.allocation_failure;
2769 return dpi.buf;
2772 /* Subroutine to handle components. */
2774 static void
2775 d_print_comp (dpi, dc)
2776 struct d_print_info *dpi;
2777 const struct demangle_component *dc;
2779 if (dc == NULL)
2781 d_print_error (dpi);
2782 return;
2784 if (d_print_saw_error (dpi))
2785 return;
2787 switch (dc->type)
2789 case DEMANGLE_COMPONENT_NAME:
2790 if ((dpi->options & DMGL_JAVA) == 0)
2791 d_append_buffer (dpi, dc->u.s_name.s, dc->u.s_name.len);
2792 else
2793 d_print_java_identifier (dpi, dc->u.s_name.s, dc->u.s_name.len);
2794 return;
2796 case DEMANGLE_COMPONENT_QUAL_NAME:
2797 case DEMANGLE_COMPONENT_LOCAL_NAME:
2798 d_print_comp (dpi, d_left (dc));
2799 if ((dpi->options & DMGL_JAVA) == 0)
2800 d_append_string_constant (dpi, "::");
2801 else
2802 d_append_char (dpi, '.');
2803 d_print_comp (dpi, d_right (dc));
2804 return;
2806 case DEMANGLE_COMPONENT_TYPED_NAME:
2808 struct d_print_mod *hold_modifiers;
2809 struct demangle_component *typed_name;
2810 struct d_print_mod adpm[4];
2811 unsigned int i;
2812 struct d_print_template dpt;
2814 /* Pass the name down to the type so that it can be printed in
2815 the right place for the type. We also have to pass down
2816 any CV-qualifiers, which apply to the this parameter. */
2817 hold_modifiers = dpi->modifiers;
2818 i = 0;
2819 typed_name = d_left (dc);
2820 while (typed_name != NULL)
2822 if (i >= sizeof adpm / sizeof adpm[0])
2824 d_print_error (dpi);
2825 return;
2828 adpm[i].next = dpi->modifiers;
2829 dpi->modifiers = &adpm[i];
2830 adpm[i].mod = typed_name;
2831 adpm[i].printed = 0;
2832 adpm[i].templates = dpi->templates;
2833 ++i;
2835 if (typed_name->type != DEMANGLE_COMPONENT_RESTRICT_THIS
2836 && typed_name->type != DEMANGLE_COMPONENT_VOLATILE_THIS
2837 && typed_name->type != DEMANGLE_COMPONENT_CONST_THIS)
2838 break;
2840 typed_name = d_left (typed_name);
2843 /* If typed_name is a template, then it applies to the
2844 function type as well. */
2845 if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
2847 dpt.next = dpi->templates;
2848 dpi->templates = &dpt;
2849 dpt.template = typed_name;
2852 /* If typed_name is a DEMANGLE_COMPONENT_LOCAL_NAME, then
2853 there may be CV-qualifiers on its right argument which
2854 really apply here; this happens when parsing a class which
2855 is local to a function. */
2856 if (typed_name->type == DEMANGLE_COMPONENT_LOCAL_NAME)
2858 struct demangle_component *local_name;
2860 local_name = d_right (typed_name);
2861 while (local_name->type == DEMANGLE_COMPONENT_RESTRICT_THIS
2862 || local_name->type == DEMANGLE_COMPONENT_VOLATILE_THIS
2863 || local_name->type == DEMANGLE_COMPONENT_CONST_THIS)
2865 if (i >= sizeof adpm / sizeof adpm[0])
2867 d_print_error (dpi);
2868 return;
2871 adpm[i] = adpm[i - 1];
2872 adpm[i].next = &adpm[i - 1];
2873 dpi->modifiers = &adpm[i];
2875 adpm[i - 1].mod = local_name;
2876 adpm[i - 1].printed = 0;
2877 adpm[i - 1].templates = dpi->templates;
2878 ++i;
2880 local_name = d_left (local_name);
2884 d_print_comp (dpi, d_right (dc));
2886 if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
2887 dpi->templates = dpt.next;
2889 /* If the modifiers didn't get printed by the type, print them
2890 now. */
2891 while (i > 0)
2893 --i;
2894 if (! adpm[i].printed)
2896 d_append_char (dpi, ' ');
2897 d_print_mod (dpi, adpm[i].mod);
2901 dpi->modifiers = hold_modifiers;
2903 return;
2906 case DEMANGLE_COMPONENT_TEMPLATE:
2908 struct d_print_mod *hold_dpm;
2910 /* Don't push modifiers into a template definition. Doing so
2911 could give the wrong definition for a template argument.
2912 Instead, treat the template essentially as a name. */
2914 hold_dpm = dpi->modifiers;
2915 dpi->modifiers = NULL;
2917 d_print_comp (dpi, d_left (dc));
2918 if (d_last_char (dpi) == '<')
2919 d_append_char (dpi, ' ');
2920 d_append_char (dpi, '<');
2921 d_print_comp (dpi, d_right (dc));
2922 /* Avoid generating two consecutive '>' characters, to avoid
2923 the C++ syntactic ambiguity. */
2924 if (d_last_char (dpi) == '>')
2925 d_append_char (dpi, ' ');
2926 d_append_char (dpi, '>');
2928 dpi->modifiers = hold_dpm;
2930 return;
2933 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
2935 long i;
2936 struct demangle_component *a;
2937 struct d_print_template *hold_dpt;
2939 if (dpi->templates == NULL)
2941 d_print_error (dpi);
2942 return;
2944 i = dc->u.s_number.number;
2945 for (a = d_right (dpi->templates->template);
2946 a != NULL;
2947 a = d_right (a))
2949 if (a->type != DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
2951 d_print_error (dpi);
2952 return;
2954 if (i <= 0)
2955 break;
2956 --i;
2958 if (i != 0 || a == NULL)
2960 d_print_error (dpi);
2961 return;
2964 /* While processing this parameter, we need to pop the list of
2965 templates. This is because the template parameter may
2966 itself be a reference to a parameter of an outer
2967 template. */
2969 hold_dpt = dpi->templates;
2970 dpi->templates = hold_dpt->next;
2972 d_print_comp (dpi, d_left (a));
2974 dpi->templates = hold_dpt;
2976 return;
2979 case DEMANGLE_COMPONENT_CTOR:
2980 d_print_comp (dpi, dc->u.s_ctor.name);
2981 return;
2983 case DEMANGLE_COMPONENT_DTOR:
2984 d_append_char (dpi, '~');
2985 d_print_comp (dpi, dc->u.s_dtor.name);
2986 return;
2988 case DEMANGLE_COMPONENT_VTABLE:
2989 d_append_string_constant (dpi, "vtable for ");
2990 d_print_comp (dpi, d_left (dc));
2991 return;
2993 case DEMANGLE_COMPONENT_VTT:
2994 d_append_string_constant (dpi, "VTT for ");
2995 d_print_comp (dpi, d_left (dc));
2996 return;
2998 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
2999 d_append_string_constant (dpi, "construction vtable for ");
3000 d_print_comp (dpi, d_left (dc));
3001 d_append_string_constant (dpi, "-in-");
3002 d_print_comp (dpi, d_right (dc));
3003 return;
3005 case DEMANGLE_COMPONENT_TYPEINFO:
3006 d_append_string_constant (dpi, "typeinfo for ");
3007 d_print_comp (dpi, d_left (dc));
3008 return;
3010 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
3011 d_append_string_constant (dpi, "typeinfo name for ");
3012 d_print_comp (dpi, d_left (dc));
3013 return;
3015 case DEMANGLE_COMPONENT_TYPEINFO_FN:
3016 d_append_string_constant (dpi, "typeinfo fn for ");
3017 d_print_comp (dpi, d_left (dc));
3018 return;
3020 case DEMANGLE_COMPONENT_THUNK:
3021 d_append_string_constant (dpi, "non-virtual thunk to ");
3022 d_print_comp (dpi, d_left (dc));
3023 return;
3025 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
3026 d_append_string_constant (dpi, "virtual thunk to ");
3027 d_print_comp (dpi, d_left (dc));
3028 return;
3030 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
3031 d_append_string_constant (dpi, "covariant return thunk to ");
3032 d_print_comp (dpi, d_left (dc));
3033 return;
3035 case DEMANGLE_COMPONENT_JAVA_CLASS:
3036 d_append_string_constant (dpi, "java Class for ");
3037 d_print_comp (dpi, d_left (dc));
3038 return;
3040 case DEMANGLE_COMPONENT_GUARD:
3041 d_append_string_constant (dpi, "guard variable for ");
3042 d_print_comp (dpi, d_left (dc));
3043 return;
3045 case DEMANGLE_COMPONENT_REFTEMP:
3046 d_append_string_constant (dpi, "reference temporary for ");
3047 d_print_comp (dpi, d_left (dc));
3048 return;
3050 case DEMANGLE_COMPONENT_SUB_STD:
3051 d_append_buffer (dpi, dc->u.s_string.string, dc->u.s_string.len);
3052 return;
3054 case DEMANGLE_COMPONENT_RESTRICT:
3055 case DEMANGLE_COMPONENT_VOLATILE:
3056 case DEMANGLE_COMPONENT_CONST:
3058 struct d_print_mod *pdpm;
3060 /* When printing arrays, it's possible to have cases where the
3061 same CV-qualifier gets pushed on the stack multiple times.
3062 We only need to print it once. */
3064 for (pdpm = dpi->modifiers; pdpm != NULL; pdpm = pdpm->next)
3066 if (! pdpm->printed)
3068 if (pdpm->mod->type != DEMANGLE_COMPONENT_RESTRICT
3069 && pdpm->mod->type != DEMANGLE_COMPONENT_VOLATILE
3070 && pdpm->mod->type != DEMANGLE_COMPONENT_CONST)
3071 break;
3072 if (pdpm->mod->type == dc->type)
3074 d_print_comp (dpi, d_left (dc));
3075 return;
3080 /* Fall through. */
3081 case DEMANGLE_COMPONENT_RESTRICT_THIS:
3082 case DEMANGLE_COMPONENT_VOLATILE_THIS:
3083 case DEMANGLE_COMPONENT_CONST_THIS:
3084 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
3085 case DEMANGLE_COMPONENT_POINTER:
3086 case DEMANGLE_COMPONENT_REFERENCE:
3087 case DEMANGLE_COMPONENT_COMPLEX:
3088 case DEMANGLE_COMPONENT_IMAGINARY:
3090 /* We keep a list of modifiers on the stack. */
3091 struct d_print_mod dpm;
3093 dpm.next = dpi->modifiers;
3094 dpi->modifiers = &dpm;
3095 dpm.mod = dc;
3096 dpm.printed = 0;
3097 dpm.templates = dpi->templates;
3099 d_print_comp (dpi, d_left (dc));
3101 /* If the modifier didn't get printed by the type, print it
3102 now. */
3103 if (! dpm.printed)
3104 d_print_mod (dpi, dc);
3106 dpi->modifiers = dpm.next;
3108 return;
3111 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
3112 if ((dpi->options & DMGL_JAVA) == 0)
3113 d_append_buffer (dpi, dc->u.s_builtin.type->name,
3114 dc->u.s_builtin.type->len);
3115 else
3116 d_append_buffer (dpi, dc->u.s_builtin.type->java_name,
3117 dc->u.s_builtin.type->java_len);
3118 return;
3120 case DEMANGLE_COMPONENT_VENDOR_TYPE:
3121 d_print_comp (dpi, d_left (dc));
3122 return;
3124 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
3126 if (d_left (dc) != NULL)
3128 struct d_print_mod dpm;
3130 /* We must pass this type down as a modifier in order to
3131 print it in the right location. */
3133 dpm.next = dpi->modifiers;
3134 dpi->modifiers = &dpm;
3135 dpm.mod = dc;
3136 dpm.printed = 0;
3137 dpm.templates = dpi->templates;
3139 d_print_comp (dpi, d_left (dc));
3141 dpi->modifiers = dpm.next;
3143 if (dpm.printed)
3144 return;
3146 d_append_char (dpi, ' ');
3149 d_print_function_type (dpi, dc, dpi->modifiers);
3151 return;
3154 case DEMANGLE_COMPONENT_ARRAY_TYPE:
3156 struct d_print_mod *hold_modifiers;
3157 struct d_print_mod adpm[4];
3158 unsigned int i;
3159 struct d_print_mod *pdpm;
3161 /* We must pass this type down as a modifier in order to print
3162 multi-dimensional arrays correctly. If the array itself is
3163 CV-qualified, we act as though the element type were
3164 CV-qualified. We do this by copying the modifiers down
3165 rather than fiddling pointers, so that we don't wind up
3166 with a d_print_mod higher on the stack pointing into our
3167 stack frame after we return. */
3169 hold_modifiers = dpi->modifiers;
3171 adpm[0].next = hold_modifiers;
3172 dpi->modifiers = &adpm[0];
3173 adpm[0].mod = dc;
3174 adpm[0].printed = 0;
3175 adpm[0].templates = dpi->templates;
3177 i = 1;
3178 pdpm = hold_modifiers;
3179 while (pdpm != NULL
3180 && (pdpm->mod->type == DEMANGLE_COMPONENT_RESTRICT
3181 || pdpm->mod->type == DEMANGLE_COMPONENT_VOLATILE
3182 || pdpm->mod->type == DEMANGLE_COMPONENT_CONST))
3184 if (! pdpm->printed)
3186 if (i >= sizeof adpm / sizeof adpm[0])
3188 d_print_error (dpi);
3189 return;
3192 adpm[i] = *pdpm;
3193 adpm[i].next = dpi->modifiers;
3194 dpi->modifiers = &adpm[i];
3195 pdpm->printed = 1;
3196 ++i;
3199 pdpm = pdpm->next;
3202 d_print_comp (dpi, d_right (dc));
3204 dpi->modifiers = hold_modifiers;
3206 if (adpm[0].printed)
3207 return;
3209 while (i > 1)
3211 --i;
3212 d_print_mod (dpi, adpm[i].mod);
3215 d_print_array_type (dpi, dc, dpi->modifiers);
3217 return;
3220 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
3222 struct d_print_mod dpm;
3224 dpm.next = dpi->modifiers;
3225 dpi->modifiers = &dpm;
3226 dpm.mod = dc;
3227 dpm.printed = 0;
3228 dpm.templates = dpi->templates;
3230 d_print_comp (dpi, d_right (dc));
3232 /* If the modifier didn't get printed by the type, print it
3233 now. */
3234 if (! dpm.printed)
3236 d_append_char (dpi, ' ');
3237 d_print_comp (dpi, d_left (dc));
3238 d_append_string_constant (dpi, "::*");
3241 dpi->modifiers = dpm.next;
3243 return;
3246 case DEMANGLE_COMPONENT_ARGLIST:
3247 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
3248 d_print_comp (dpi, d_left (dc));
3249 if (d_right (dc) != NULL)
3251 d_append_string_constant (dpi, ", ");
3252 d_print_comp (dpi, d_right (dc));
3254 return;
3256 case DEMANGLE_COMPONENT_OPERATOR:
3258 char c;
3260 d_append_string_constant (dpi, "operator");
3261 c = dc->u.s_operator.op->name[0];
3262 if (IS_LOWER (c))
3263 d_append_char (dpi, ' ');
3264 d_append_buffer (dpi, dc->u.s_operator.op->name,
3265 dc->u.s_operator.op->len);
3266 return;
3269 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
3270 d_append_string_constant (dpi, "operator ");
3271 d_print_comp (dpi, dc->u.s_extended_operator.name);
3272 return;
3274 case DEMANGLE_COMPONENT_CAST:
3275 d_append_string_constant (dpi, "operator ");
3276 d_print_cast (dpi, dc);
3277 return;
3279 case DEMANGLE_COMPONENT_UNARY:
3280 if (d_left (dc)->type != DEMANGLE_COMPONENT_CAST)
3281 d_print_expr_op (dpi, d_left (dc));
3282 else
3284 d_append_char (dpi, '(');
3285 d_print_cast (dpi, d_left (dc));
3286 d_append_char (dpi, ')');
3288 d_append_char (dpi, '(');
3289 d_print_comp (dpi, d_right (dc));
3290 d_append_char (dpi, ')');
3291 return;
3293 case DEMANGLE_COMPONENT_BINARY:
3294 if (d_right (dc)->type != DEMANGLE_COMPONENT_BINARY_ARGS)
3296 d_print_error (dpi);
3297 return;
3300 /* We wrap an expression which uses the greater-than operator in
3301 an extra layer of parens so that it does not get confused
3302 with the '>' which ends the template parameters. */
3303 if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
3304 && d_left (dc)->u.s_operator.op->len == 1
3305 && d_left (dc)->u.s_operator.op->name[0] == '>')
3306 d_append_char (dpi, '(');
3308 d_append_char (dpi, '(');
3309 d_print_comp (dpi, d_left (d_right (dc)));
3310 d_append_string_constant (dpi, ") ");
3311 d_print_expr_op (dpi, d_left (dc));
3312 d_append_string_constant (dpi, " (");
3313 d_print_comp (dpi, d_right (d_right (dc)));
3314 d_append_char (dpi, ')');
3316 if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
3317 && d_left (dc)->u.s_operator.op->len == 1
3318 && d_left (dc)->u.s_operator.op->name[0] == '>')
3319 d_append_char (dpi, ')');
3321 return;
3323 case DEMANGLE_COMPONENT_BINARY_ARGS:
3324 /* We should only see this as part of DEMANGLE_COMPONENT_BINARY. */
3325 d_print_error (dpi);
3326 return;
3328 case DEMANGLE_COMPONENT_TRINARY:
3329 if (d_right (dc)->type != DEMANGLE_COMPONENT_TRINARY_ARG1
3330 || d_right (d_right (dc))->type != DEMANGLE_COMPONENT_TRINARY_ARG2)
3332 d_print_error (dpi);
3333 return;
3335 d_append_char (dpi, '(');
3336 d_print_comp (dpi, d_left (d_right (dc)));
3337 d_append_string_constant (dpi, ") ");
3338 d_print_expr_op (dpi, d_left (dc));
3339 d_append_string_constant (dpi, " (");
3340 d_print_comp (dpi, d_left (d_right (d_right (dc))));
3341 d_append_string_constant (dpi, ") : (");
3342 d_print_comp (dpi, d_right (d_right (d_right (dc))));
3343 d_append_char (dpi, ')');
3344 return;
3346 case DEMANGLE_COMPONENT_TRINARY_ARG1:
3347 case DEMANGLE_COMPONENT_TRINARY_ARG2:
3348 /* We should only see these are part of DEMANGLE_COMPONENT_TRINARY. */
3349 d_print_error (dpi);
3350 return;
3352 case DEMANGLE_COMPONENT_LITERAL:
3353 case DEMANGLE_COMPONENT_LITERAL_NEG:
3355 enum d_builtin_type_print tp;
3357 /* For some builtin types, produce simpler output. */
3358 tp = D_PRINT_DEFAULT;
3359 if (d_left (dc)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE)
3361 tp = d_left (dc)->u.s_builtin.type->print;
3362 switch (tp)
3364 case D_PRINT_INT:
3365 case D_PRINT_UNSIGNED:
3366 case D_PRINT_LONG:
3367 case D_PRINT_UNSIGNED_LONG:
3368 case D_PRINT_LONG_LONG:
3369 case D_PRINT_UNSIGNED_LONG_LONG:
3370 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME)
3372 if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
3373 d_append_char (dpi, '-');
3374 d_print_comp (dpi, d_right (dc));
3375 switch (tp)
3377 default:
3378 break;
3379 case D_PRINT_UNSIGNED:
3380 d_append_char (dpi, 'u');
3381 break;
3382 case D_PRINT_LONG:
3383 d_append_char (dpi, 'l');
3384 break;
3385 case D_PRINT_UNSIGNED_LONG:
3386 d_append_string_constant (dpi, "ul");
3387 break;
3388 case D_PRINT_LONG_LONG:
3389 d_append_string_constant (dpi, "ll");
3390 break;
3391 case D_PRINT_UNSIGNED_LONG_LONG:
3392 d_append_string_constant (dpi, "ull");
3393 break;
3395 return;
3397 break;
3399 case D_PRINT_BOOL:
3400 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME
3401 && d_right (dc)->u.s_name.len == 1
3402 && dc->type == DEMANGLE_COMPONENT_LITERAL)
3404 switch (d_right (dc)->u.s_name.s[0])
3406 case '0':
3407 d_append_string_constant (dpi, "false");
3408 return;
3409 case '1':
3410 d_append_string_constant (dpi, "true");
3411 return;
3412 default:
3413 break;
3416 break;
3418 default:
3419 break;
3423 d_append_char (dpi, '(');
3424 d_print_comp (dpi, d_left (dc));
3425 d_append_char (dpi, ')');
3426 if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
3427 d_append_char (dpi, '-');
3428 if (tp == D_PRINT_FLOAT)
3429 d_append_char (dpi, '[');
3430 d_print_comp (dpi, d_right (dc));
3431 if (tp == D_PRINT_FLOAT)
3432 d_append_char (dpi, ']');
3434 return;
3436 default:
3437 d_print_error (dpi);
3438 return;
3442 /* Print a Java dentifier. For Java we try to handle encoded extended
3443 Unicode characters. The C++ ABI doesn't mention Unicode encoding,
3444 so we don't it for C++. Characters are encoded as
3445 __U<hex-char>+_. */
3447 static void
3448 d_print_java_identifier (dpi, name, len)
3449 struct d_print_info *dpi;
3450 const char *name;
3451 int len;
3453 const char *p;
3454 const char *end;
3456 end = name + len;
3457 for (p = name; p < end; ++p)
3459 if (end - p > 3
3460 && p[0] == '_'
3461 && p[1] == '_'
3462 && p[2] == 'U')
3464 unsigned long c;
3465 const char *q;
3467 c = 0;
3468 for (q = p + 3; q < end; ++q)
3470 int dig;
3472 if (IS_DIGIT (*q))
3473 dig = *q - '0';
3474 else if (*q >= 'A' && *q <= 'F')
3475 dig = *q - 'A' + 10;
3476 else if (*q >= 'a' && *q <= 'f')
3477 dig = *q - 'a' + 10;
3478 else
3479 break;
3481 c = c * 16 + dig;
3483 /* If the Unicode character is larger than 256, we don't try
3484 to deal with it here. FIXME. */
3485 if (q < end && *q == '_' && c < 256)
3487 d_append_char (dpi, c);
3488 p = q;
3489 continue;
3493 d_append_char (dpi, *p);
3497 /* Print a list of modifiers. SUFFIX is 1 if we are printing
3498 qualifiers on this after printing a function. */
3500 static void
3501 d_print_mod_list (dpi, mods, suffix)
3502 struct d_print_info *dpi;
3503 struct d_print_mod *mods;
3504 int suffix;
3506 struct d_print_template *hold_dpt;
3508 if (mods == NULL || d_print_saw_error (dpi))
3509 return;
3511 if (mods->printed
3512 || (! suffix
3513 && (mods->mod->type == DEMANGLE_COMPONENT_RESTRICT_THIS
3514 || mods->mod->type == DEMANGLE_COMPONENT_VOLATILE_THIS
3515 || mods->mod->type == DEMANGLE_COMPONENT_CONST_THIS)))
3517 d_print_mod_list (dpi, mods->next, suffix);
3518 return;
3521 mods->printed = 1;
3523 hold_dpt = dpi->templates;
3524 dpi->templates = mods->templates;
3526 if (mods->mod->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
3528 d_print_function_type (dpi, mods->mod, mods->next);
3529 dpi->templates = hold_dpt;
3530 return;
3532 else if (mods->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
3534 d_print_array_type (dpi, mods->mod, mods->next);
3535 dpi->templates = hold_dpt;
3536 return;
3538 else if (mods->mod->type == DEMANGLE_COMPONENT_LOCAL_NAME)
3540 struct d_print_mod *hold_modifiers;
3541 struct demangle_component *dc;
3543 /* When this is on the modifier stack, we have pulled any
3544 qualifiers off the right argument already. Otherwise, we
3545 print it as usual, but don't let the left argument see any
3546 modifiers. */
3548 hold_modifiers = dpi->modifiers;
3549 dpi->modifiers = NULL;
3550 d_print_comp (dpi, d_left (mods->mod));
3551 dpi->modifiers = hold_modifiers;
3553 if ((dpi->options & DMGL_JAVA) == 0)
3554 d_append_string_constant (dpi, "::");
3555 else
3556 d_append_char (dpi, '.');
3558 dc = d_right (mods->mod);
3559 while (dc->type == DEMANGLE_COMPONENT_RESTRICT_THIS
3560 || dc->type == DEMANGLE_COMPONENT_VOLATILE_THIS
3561 || dc->type == DEMANGLE_COMPONENT_CONST_THIS)
3562 dc = d_left (dc);
3564 d_print_comp (dpi, dc);
3566 dpi->templates = hold_dpt;
3567 return;
3570 d_print_mod (dpi, mods->mod);
3572 dpi->templates = hold_dpt;
3574 d_print_mod_list (dpi, mods->next, suffix);
3577 /* Print a modifier. */
3579 static void
3580 d_print_mod (dpi, mod)
3581 struct d_print_info *dpi;
3582 const struct demangle_component *mod;
3584 switch (mod->type)
3586 case DEMANGLE_COMPONENT_RESTRICT:
3587 case DEMANGLE_COMPONENT_RESTRICT_THIS:
3588 d_append_string_constant (dpi, " restrict");
3589 return;
3590 case DEMANGLE_COMPONENT_VOLATILE:
3591 case DEMANGLE_COMPONENT_VOLATILE_THIS:
3592 d_append_string_constant (dpi, " volatile");
3593 return;
3594 case DEMANGLE_COMPONENT_CONST:
3595 case DEMANGLE_COMPONENT_CONST_THIS:
3596 d_append_string_constant (dpi, " const");
3597 return;
3598 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
3599 d_append_char (dpi, ' ');
3600 d_print_comp (dpi, d_right (mod));
3601 return;
3602 case DEMANGLE_COMPONENT_POINTER:
3603 /* There is no pointer symbol in Java. */
3604 if ((dpi->options & DMGL_JAVA) == 0)
3605 d_append_char (dpi, '*');
3606 return;
3607 case DEMANGLE_COMPONENT_REFERENCE:
3608 d_append_char (dpi, '&');
3609 return;
3610 case DEMANGLE_COMPONENT_COMPLEX:
3611 d_append_string_constant (dpi, "complex ");
3612 return;
3613 case DEMANGLE_COMPONENT_IMAGINARY:
3614 d_append_string_constant (dpi, "imaginary ");
3615 return;
3616 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
3617 if (d_last_char (dpi) != '(')
3618 d_append_char (dpi, ' ');
3619 d_print_comp (dpi, d_left (mod));
3620 d_append_string_constant (dpi, "::*");
3621 return;
3622 case DEMANGLE_COMPONENT_TYPED_NAME:
3623 d_print_comp (dpi, d_left (mod));
3624 return;
3625 default:
3626 /* Otherwise, we have something that won't go back on the
3627 modifier stack, so we can just print it. */
3628 d_print_comp (dpi, mod);
3629 return;
3633 /* Print a function type, except for the return type. */
3635 static void
3636 d_print_function_type (dpi, dc, mods)
3637 struct d_print_info *dpi;
3638 const struct demangle_component *dc;
3639 struct d_print_mod *mods;
3641 int need_paren;
3642 int saw_mod;
3643 int need_space;
3644 struct d_print_mod *p;
3645 struct d_print_mod *hold_modifiers;
3647 need_paren = 0;
3648 saw_mod = 0;
3649 need_space = 0;
3650 for (p = mods; p != NULL; p = p->next)
3652 if (p->printed)
3653 break;
3655 saw_mod = 1;
3656 switch (p->mod->type)
3658 case DEMANGLE_COMPONENT_POINTER:
3659 case DEMANGLE_COMPONENT_REFERENCE:
3660 need_paren = 1;
3661 break;
3662 case DEMANGLE_COMPONENT_RESTRICT:
3663 case DEMANGLE_COMPONENT_VOLATILE:
3664 case DEMANGLE_COMPONENT_CONST:
3665 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
3666 case DEMANGLE_COMPONENT_COMPLEX:
3667 case DEMANGLE_COMPONENT_IMAGINARY:
3668 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
3669 need_space = 1;
3670 need_paren = 1;
3671 break;
3672 case DEMANGLE_COMPONENT_RESTRICT_THIS:
3673 case DEMANGLE_COMPONENT_VOLATILE_THIS:
3674 case DEMANGLE_COMPONENT_CONST_THIS:
3675 break;
3676 default:
3677 break;
3679 if (need_paren)
3680 break;
3683 if (d_left (dc) != NULL && ! saw_mod)
3684 need_paren = 1;
3686 if (need_paren)
3688 if (! need_space)
3690 if (d_last_char (dpi) != '('
3691 && d_last_char (dpi) != '*')
3692 need_space = 1;
3694 if (need_space && d_last_char (dpi) != ' ')
3695 d_append_char (dpi, ' ');
3696 d_append_char (dpi, '(');
3699 hold_modifiers = dpi->modifiers;
3700 dpi->modifiers = NULL;
3702 d_print_mod_list (dpi, mods, 0);
3704 if (need_paren)
3705 d_append_char (dpi, ')');
3707 d_append_char (dpi, '(');
3709 if (d_right (dc) != NULL)
3710 d_print_comp (dpi, d_right (dc));
3712 d_append_char (dpi, ')');
3714 d_print_mod_list (dpi, mods, 1);
3716 dpi->modifiers = hold_modifiers;
3719 /* Print an array type, except for the element type. */
3721 static void
3722 d_print_array_type (dpi, dc, mods)
3723 struct d_print_info *dpi;
3724 const struct demangle_component *dc;
3725 struct d_print_mod *mods;
3727 int need_space;
3729 need_space = 1;
3730 if (mods != NULL)
3732 int need_paren;
3733 struct d_print_mod *p;
3735 need_paren = 0;
3736 for (p = mods; p != NULL; p = p->next)
3738 if (! p->printed)
3740 if (p->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
3742 need_space = 0;
3743 break;
3745 else
3747 need_paren = 1;
3748 need_space = 1;
3749 break;
3754 if (need_paren)
3755 d_append_string_constant (dpi, " (");
3757 d_print_mod_list (dpi, mods, 0);
3759 if (need_paren)
3760 d_append_char (dpi, ')');
3763 if (need_space)
3764 d_append_char (dpi, ' ');
3766 d_append_char (dpi, '[');
3768 if (d_left (dc) != NULL)
3769 d_print_comp (dpi, d_left (dc));
3771 d_append_char (dpi, ']');
3774 /* Print an operator in an expression. */
3776 static void
3777 d_print_expr_op (dpi, dc)
3778 struct d_print_info *dpi;
3779 const struct demangle_component *dc;
3781 if (dc->type == DEMANGLE_COMPONENT_OPERATOR)
3782 d_append_buffer (dpi, dc->u.s_operator.op->name,
3783 dc->u.s_operator.op->len);
3784 else
3785 d_print_comp (dpi, dc);
3788 /* Print a cast. */
3790 static void
3791 d_print_cast (dpi, dc)
3792 struct d_print_info *dpi;
3793 const struct demangle_component *dc;
3795 if (d_left (dc)->type != DEMANGLE_COMPONENT_TEMPLATE)
3796 d_print_comp (dpi, d_left (dc));
3797 else
3799 struct d_print_mod *hold_dpm;
3800 struct d_print_template dpt;
3802 /* It appears that for a templated cast operator, we need to put
3803 the template parameters in scope for the operator name, but
3804 not for the parameters. The effect is that we need to handle
3805 the template printing here. */
3807 hold_dpm = dpi->modifiers;
3808 dpi->modifiers = NULL;
3810 dpt.next = dpi->templates;
3811 dpi->templates = &dpt;
3812 dpt.template = d_left (dc);
3814 d_print_comp (dpi, d_left (d_left (dc)));
3816 dpi->templates = dpt.next;
3818 if (d_last_char (dpi) == '<')
3819 d_append_char (dpi, ' ');
3820 d_append_char (dpi, '<');
3821 d_print_comp (dpi, d_right (d_left (dc)));
3822 /* Avoid generating two consecutive '>' characters, to avoid
3823 the C++ syntactic ambiguity. */
3824 if (d_last_char (dpi) == '>')
3825 d_append_char (dpi, ' ');
3826 d_append_char (dpi, '>');
3828 dpi->modifiers = hold_dpm;
3832 /* Initialize the information structure we use to pass around
3833 information. */
3835 CP_STATIC_IF_GLIBCPP_V3
3836 void
3837 cplus_demangle_init_info (mangled, options, len, di)
3838 const char *mangled;
3839 int options;
3840 size_t len;
3841 struct d_info *di;
3843 di->s = mangled;
3844 di->send = mangled + len;
3845 di->options = options;
3847 di->n = mangled;
3849 /* We can not need more components than twice the number of chars in
3850 the mangled string. Most components correspond directly to
3851 chars, but the ARGLIST types are exceptions. */
3852 di->num_comps = 2 * len;
3853 di->next_comp = 0;
3855 /* Similarly, we can not need more substitutions than there are
3856 chars in the mangled string. */
3857 di->num_subs = len;
3858 di->next_sub = 0;
3859 di->did_subs = 0;
3861 di->last_name = NULL;
3863 di->expansion = 0;
3866 /* Entry point for the demangler. If MANGLED is a g++ v3 ABI mangled
3867 name, return a buffer allocated with malloc holding the demangled
3868 name. OPTIONS is the usual libiberty demangler options. On
3869 success, this sets *PALC to the allocated size of the returned
3870 buffer. On failure, this sets *PALC to 0 for a bad name, or 1 for
3871 a memory allocation failure. On failure, this returns NULL. */
3873 static char *
3874 d_demangle (mangled, options, palc)
3875 const char* mangled;
3876 int options;
3877 size_t *palc;
3879 size_t len;
3880 int type;
3881 struct d_info di;
3882 struct demangle_component *dc;
3883 int estimate;
3884 char *ret;
3886 *palc = 0;
3888 len = strlen (mangled);
3890 if (mangled[0] == '_' && mangled[1] == 'Z')
3891 type = 0;
3892 else if (strncmp (mangled, "_GLOBAL_", 8) == 0
3893 && (mangled[8] == '.' || mangled[8] == '_' || mangled[8] == '$')
3894 && (mangled[9] == 'D' || mangled[9] == 'I')
3895 && mangled[10] == '_')
3897 char *r;
3899 r = malloc (40 + len - 11);
3900 if (r == NULL)
3901 *palc = 1;
3902 else
3904 if (mangled[9] == 'I')
3905 strcpy (r, "global constructors keyed to ");
3906 else
3907 strcpy (r, "global destructors keyed to ");
3908 strcat (r, mangled + 11);
3910 return r;
3912 else
3914 if ((options & DMGL_TYPES) == 0)
3915 return NULL;
3916 type = 1;
3919 cplus_demangle_init_info (mangled, options, len, &di);
3922 #ifdef CP_DYNAMIC_ARRAYS
3923 __extension__ struct demangle_component comps[di.num_comps];
3924 __extension__ struct demangle_component *subs[di.num_subs];
3926 di.comps = &comps[0];
3927 di.subs = &subs[0];
3928 #else
3929 di.comps = ((struct demangle_component *)
3930 malloc (di.num_comps * sizeof (struct demangle_component)));
3931 di.subs = ((struct demangle_component **)
3932 malloc (di.num_subs * sizeof (struct demangle_component *)));
3933 if (di.comps == NULL || di.subs == NULL)
3935 if (di.comps != NULL)
3936 free (di.comps);
3937 if (di.subs != NULL)
3938 free (di.subs);
3939 *palc = 1;
3940 return NULL;
3942 #endif
3944 if (! type)
3945 dc = cplus_demangle_mangled_name (&di, 1);
3946 else
3947 dc = cplus_demangle_type (&di);
3949 /* If DMGL_PARAMS is set, then if we didn't consume the entire
3950 mangled string, then we didn't successfully demangle it. If
3951 DMGL_PARAMS is not set, we didn't look at the trailing
3952 parameters. */
3953 if (((options & DMGL_PARAMS) != 0) && d_peek_char (&di) != '\0')
3954 dc = NULL;
3956 #ifdef CP_DEMANGLE_DEBUG
3957 if (dc == NULL)
3958 printf ("failed demangling\n");
3959 else
3960 d_dump (dc, 0);
3961 #endif
3963 /* We try to guess the length of the demangled string, to minimize
3964 calls to realloc during demangling. */
3965 estimate = len + di.expansion + 10 * di.did_subs;
3966 estimate += estimate / 8;
3968 ret = NULL;
3969 if (dc != NULL)
3970 ret = cplus_demangle_print (options, dc, estimate, palc);
3972 #ifndef CP_DYNAMIC_ARRAYS
3973 free (di.comps);
3974 free (di.subs);
3975 #endif
3977 #ifdef CP_DEMANGLE_DEBUG
3978 if (ret != NULL)
3980 int rlen;
3982 rlen = strlen (ret);
3983 if (rlen > 2 * estimate)
3984 printf ("*** Length %d much greater than estimate %d\n",
3985 rlen, estimate);
3986 else if (rlen > estimate)
3987 printf ("*** Length %d greater than estimate %d\n",
3988 rlen, estimate);
3989 else if (rlen < estimate / 2)
3990 printf ("*** Length %d much less than estimate %d\n",
3991 rlen, estimate);
3993 #endif
3996 return ret;
3999 #if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3)
4001 extern char *__cxa_demangle PARAMS ((const char *, char *, size_t *, int *));
4003 /* ia64 ABI-mandated entry point in the C++ runtime library for
4004 performing demangling. MANGLED_NAME is a NUL-terminated character
4005 string containing the name to be demangled.
4007 OUTPUT_BUFFER is a region of memory, allocated with malloc, of
4008 *LENGTH bytes, into which the demangled name is stored. If
4009 OUTPUT_BUFFER is not long enough, it is expanded using realloc.
4010 OUTPUT_BUFFER may instead be NULL; in that case, the demangled name
4011 is placed in a region of memory allocated with malloc.
4013 If LENGTH is non-NULL, the length of the buffer conaining the
4014 demangled name, is placed in *LENGTH.
4016 The return value is a pointer to the start of the NUL-terminated
4017 demangled name, or NULL if the demangling fails. The caller is
4018 responsible for deallocating this memory using free.
4020 *STATUS is set to one of the following values:
4021 0: The demangling operation succeeded.
4022 -1: A memory allocation failure occurred.
4023 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
4024 -3: One of the arguments is invalid.
4026 The demangling is performed using the C++ ABI mangling rules, with
4027 GNU extensions. */
4029 char *
4030 __cxa_demangle (mangled_name, output_buffer, length, status)
4031 const char *mangled_name;
4032 char *output_buffer;
4033 size_t *length;
4034 int *status;
4036 char *demangled;
4037 size_t alc;
4039 if (mangled_name == NULL)
4041 if (status != NULL)
4042 *status = -3;
4043 return NULL;
4046 if (output_buffer != NULL && length == NULL)
4048 if (status != NULL)
4049 *status = -3;
4050 return NULL;
4053 /* The specification for __cxa_demangle() is that if the mangled
4054 name could be either an extern "C" identifier, or an internal
4055 built-in type name, then we resolve it as the identifier. All
4056 internal built-in type names are a single lower case character.
4057 Frankly, this simplistic disambiguation doesn't make sense to me,
4058 but it is documented, so we implement it here. */
4059 if (IS_LOWER (mangled_name[0])
4060 && mangled_name[1] == '\0'
4061 && cplus_demangle_builtin_types[mangled_name[0] - 'a'].name != NULL)
4063 if (status != NULL)
4064 *status = -2;
4065 return NULL;
4068 demangled = d_demangle (mangled_name, DMGL_PARAMS | DMGL_TYPES, &alc);
4070 if (demangled == NULL)
4072 if (status != NULL)
4074 if (alc == 1)
4075 *status = -1;
4076 else
4077 *status = -2;
4079 return NULL;
4082 if (output_buffer == NULL)
4084 if (length != NULL)
4085 *length = alc;
4087 else
4089 if (strlen (demangled) < *length)
4091 strcpy (output_buffer, demangled);
4092 free (demangled);
4093 demangled = output_buffer;
4095 else
4097 free (output_buffer);
4098 *length = alc;
4102 if (status != NULL)
4103 *status = 0;
4105 return demangled;
4108 #else /* ! (IN_LIBGCC2 || IN_GLIBCPP_V3) */
4110 /* Entry point for libiberty demangler. If MANGLED is a g++ v3 ABI
4111 mangled name, return a buffer allocated with malloc holding the
4112 demangled name. Otherwise, return NULL. */
4114 char *
4115 cplus_demangle_v3 (mangled, options)
4116 const char* mangled;
4117 int options;
4119 size_t alc;
4121 return d_demangle (mangled, options, &alc);
4124 /* Demangle a Java symbol. Java uses a subset of the V3 ABI C++ mangling
4125 conventions, but the output formatting is a little different.
4126 This instructs the C++ demangler not to emit pointer characters ("*"), and
4127 to use Java's namespace separator symbol ("." instead of "::"). It then
4128 does an additional pass over the demangled output to replace instances
4129 of JArray<TYPE> with TYPE[]. */
4131 char *
4132 java_demangle_v3 (mangled)
4133 const char* mangled;
4135 size_t alc;
4136 char *demangled;
4137 int nesting;
4138 char *from;
4139 char *to;
4141 demangled = d_demangle (mangled, DMGL_JAVA | DMGL_PARAMS, &alc);
4143 if (demangled == NULL)
4144 return NULL;
4146 nesting = 0;
4147 from = demangled;
4148 to = from;
4149 while (*from != '\0')
4151 if (strncmp (from, "JArray<", 7) == 0)
4153 from += 7;
4154 ++nesting;
4156 else if (nesting > 0 && *from == '>')
4158 while (to > demangled && to[-1] == ' ')
4159 --to;
4160 *to++ = '[';
4161 *to++ = ']';
4162 --nesting;
4163 ++from;
4165 else
4166 *to++ = *from++;
4169 *to = '\0';
4171 return demangled;
4174 #endif /* IN_LIBGCC2 || IN_GLIBCPP_V3 */
4176 #ifndef IN_GLIBCPP_V3
4178 /* Demangle a string in order to find out whether it is a constructor
4179 or destructor. Return non-zero on success. Set *CTOR_KIND and
4180 *DTOR_KIND appropriately. */
4182 static int
4183 is_ctor_or_dtor (mangled, ctor_kind, dtor_kind)
4184 const char *mangled;
4185 enum gnu_v3_ctor_kinds *ctor_kind;
4186 enum gnu_v3_dtor_kinds *dtor_kind;
4188 struct d_info di;
4189 struct demangle_component *dc;
4190 int ret;
4192 *ctor_kind = (enum gnu_v3_ctor_kinds) 0;
4193 *dtor_kind = (enum gnu_v3_dtor_kinds) 0;
4195 cplus_demangle_init_info (mangled, DMGL_GNU_V3, strlen (mangled), &di);
4198 #ifdef CP_DYNAMIC_ARRAYS
4199 __extension__ struct demangle_component comps[di.num_comps];
4200 __extension__ struct demangle_component *subs[di.num_subs];
4202 di.comps = &comps[0];
4203 di.subs = &subs[0];
4204 #else
4205 di.comps = ((struct demangle_component *)
4206 malloc (di.num_comps * sizeof (struct demangle_component)));
4207 di.subs = ((struct demangle_component **)
4208 malloc (di.num_subs * sizeof (struct demangle_component *)));
4209 if (di.comps == NULL || di.subs == NULL)
4211 if (di.comps != NULL)
4212 free (di.comps);
4213 if (di.subs != NULL)
4214 free (di.subs);
4215 return 0;
4217 #endif
4219 dc = cplus_demangle_mangled_name (&di, 1);
4221 /* Note that because we did not pass DMGL_PARAMS, we don't expect
4222 to demangle the entire string. */
4224 ret = 0;
4225 while (dc != NULL)
4227 switch (dc->type)
4229 default:
4230 dc = NULL;
4231 break;
4232 case DEMANGLE_COMPONENT_TYPED_NAME:
4233 case DEMANGLE_COMPONENT_TEMPLATE:
4234 case DEMANGLE_COMPONENT_RESTRICT_THIS:
4235 case DEMANGLE_COMPONENT_VOLATILE_THIS:
4236 case DEMANGLE_COMPONENT_CONST_THIS:
4237 dc = d_left (dc);
4238 break;
4239 case DEMANGLE_COMPONENT_QUAL_NAME:
4240 case DEMANGLE_COMPONENT_LOCAL_NAME:
4241 dc = d_right (dc);
4242 break;
4243 case DEMANGLE_COMPONENT_CTOR:
4244 *ctor_kind = dc->u.s_ctor.kind;
4245 ret = 1;
4246 dc = NULL;
4247 break;
4248 case DEMANGLE_COMPONENT_DTOR:
4249 *dtor_kind = dc->u.s_dtor.kind;
4250 ret = 1;
4251 dc = NULL;
4252 break;
4256 #ifndef CP_DYNAMIC_ARRAYS
4257 free (di.subs);
4258 free (di.comps);
4259 #endif
4262 return ret;
4265 /* Return whether NAME is the mangled form of a g++ V3 ABI constructor
4266 name. A non-zero return indicates the type of constructor. */
4268 enum gnu_v3_ctor_kinds
4269 is_gnu_v3_mangled_ctor (name)
4270 const char *name;
4272 enum gnu_v3_ctor_kinds ctor_kind;
4273 enum gnu_v3_dtor_kinds dtor_kind;
4275 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
4276 return (enum gnu_v3_ctor_kinds) 0;
4277 return ctor_kind;
4281 /* Return whether NAME is the mangled form of a g++ V3 ABI destructor
4282 name. A non-zero return indicates the type of destructor. */
4284 enum gnu_v3_dtor_kinds
4285 is_gnu_v3_mangled_dtor (name)
4286 const char *name;
4288 enum gnu_v3_ctor_kinds ctor_kind;
4289 enum gnu_v3_dtor_kinds dtor_kind;
4291 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
4292 return (enum gnu_v3_dtor_kinds) 0;
4293 return dtor_kind;
4296 #endif /* IN_GLIBCPP_V3 */
4298 #ifdef STANDALONE_DEMANGLER
4300 #include "getopt.h"
4301 #include "dyn-string.h"
4303 static void print_usage PARAMS ((FILE* fp, int exit_value));
4305 #define IS_ALPHA(CHAR) \
4306 (((CHAR) >= 'a' && (CHAR) <= 'z') \
4307 || ((CHAR) >= 'A' && (CHAR) <= 'Z'))
4309 /* Non-zero if CHAR is a character than can occur in a mangled name. */
4310 #define is_mangled_char(CHAR) \
4311 (IS_ALPHA (CHAR) || IS_DIGIT (CHAR) \
4312 || (CHAR) == '_' || (CHAR) == '.' || (CHAR) == '$')
4314 /* The name of this program, as invoked. */
4315 const char* program_name;
4317 /* Prints usage summary to FP and then exits with EXIT_VALUE. */
4319 static void
4320 print_usage (fp, exit_value)
4321 FILE* fp;
4322 int exit_value;
4324 fprintf (fp, "Usage: %s [options] [names ...]\n", program_name);
4325 fprintf (fp, "Options:\n");
4326 fprintf (fp, " -h,--help Display this message.\n");
4327 fprintf (fp, " -p,--no-params Don't display function parameters\n");
4328 fprintf (fp, " -v,--verbose Produce verbose demanglings.\n");
4329 fprintf (fp, "If names are provided, they are demangled. Otherwise filters standard input.\n");
4331 exit (exit_value);
4334 /* Option specification for getopt_long. */
4335 static const struct option long_options[] =
4337 { "help", no_argument, NULL, 'h' },
4338 { "no-params", no_argument, NULL, 'p' },
4339 { "verbose", no_argument, NULL, 'v' },
4340 { NULL, no_argument, NULL, 0 },
4343 /* Main entry for a demangling filter executable. It will demangle
4344 its command line arguments, if any. If none are provided, it will
4345 filter stdin to stdout, replacing any recognized mangled C++ names
4346 with their demangled equivalents. */
4349 main (argc, argv)
4350 int argc;
4351 char *argv[];
4353 int i;
4354 int opt_char;
4355 int options = DMGL_PARAMS | DMGL_ANSI | DMGL_TYPES;
4357 /* Use the program name of this program, as invoked. */
4358 program_name = argv[0];
4360 /* Parse options. */
4363 opt_char = getopt_long (argc, argv, "hpv", long_options, NULL);
4364 switch (opt_char)
4366 case '?': /* Unrecognized option. */
4367 print_usage (stderr, 1);
4368 break;
4370 case 'h':
4371 print_usage (stdout, 0);
4372 break;
4374 case 'p':
4375 options &= ~ DMGL_PARAMS;
4376 break;
4378 case 'v':
4379 options |= DMGL_VERBOSE;
4380 break;
4383 while (opt_char != -1);
4385 if (optind == argc)
4386 /* No command line arguments were provided. Filter stdin. */
4388 dyn_string_t mangled = dyn_string_new (3);
4389 char *s;
4391 /* Read all of input. */
4392 while (!feof (stdin))
4394 char c;
4396 /* Pile characters into mangled until we hit one that can't
4397 occur in a mangled name. */
4398 c = getchar ();
4399 while (!feof (stdin) && is_mangled_char (c))
4401 dyn_string_append_char (mangled, c);
4402 if (feof (stdin))
4403 break;
4404 c = getchar ();
4407 if (dyn_string_length (mangled) > 0)
4409 #ifdef IN_GLIBCPP_V3
4410 s = __cxa_demangle (dyn_string_buf (mangled), NULL, NULL, NULL);
4411 #else
4412 s = cplus_demangle_v3 (dyn_string_buf (mangled), options);
4413 #endif
4415 if (s != NULL)
4417 fputs (s, stdout);
4418 free (s);
4420 else
4422 /* It might not have been a mangled name. Print the
4423 original text. */
4424 fputs (dyn_string_buf (mangled), stdout);
4427 dyn_string_clear (mangled);
4430 /* If we haven't hit EOF yet, we've read one character that
4431 can't occur in a mangled name, so print it out. */
4432 if (!feof (stdin))
4433 putchar (c);
4436 dyn_string_delete (mangled);
4438 else
4439 /* Demangle command line arguments. */
4441 /* Loop over command line arguments. */
4442 for (i = optind; i < argc; ++i)
4444 char *s;
4445 #ifdef IN_GLIBCPP_V3
4446 int status;
4447 #endif
4449 /* Attempt to demangle. */
4450 #ifdef IN_GLIBCPP_V3
4451 s = __cxa_demangle (argv[i], NULL, NULL, &status);
4452 #else
4453 s = cplus_demangle_v3 (argv[i], options);
4454 #endif
4456 /* If it worked, print the demangled name. */
4457 if (s != NULL)
4459 printf ("%s\n", s);
4460 free (s);
4462 else
4464 #ifdef IN_GLIBCPP_V3
4465 fprintf (stderr, "Failed: %s (status %d)\n", argv[i], status);
4466 #else
4467 fprintf (stderr, "Failed: %s\n", argv[i]);
4468 #endif
4473 return 0;
4476 #endif /* STANDALONE_DEMANGLER */