1 /* Demangler for g++ V3 ABI.
2 Copyright (C) 2003 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
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.
45 #include "libiberty.h"
48 /* This code implements a demangler for the g++ V3 ABI. The ABI is
49 described on this web page:
50 http://www.codesourcery.com/cxx-abi/abi.html#mangling
52 This code was written while looking at the demangler written by
53 Alex Samuel <samuel@codesourcery.com>.
55 This code first pulls the mangled name apart into a list of
56 components, and then walks the list generating the demangled
59 /* Avoid pulling in the ctype tables for this simple usage. */
60 #define IS_DIGIT(c) ((c) >= '0' && (c) <= '9')
62 /* The prefix prepended by GCC to an identifier represnting the
63 anonymous namespace. */
64 #define ANONYMOUS_NAMESPACE_PREFIX "_GLOBAL_"
65 #define ANONYMOUS_NAMESPACE_PREFIX_LEN \
66 (sizeof (ANONYMOUS_NAMESPACE_PREFIX) - 1)
68 /* Information we keep for operators. */
70 struct d_operator_info
76 /* Number of arguments. */
80 /* How to print the value of a builtin type. */
82 enum d_builtin_type_print
84 /* Print as (type)val. */
86 /* Print as integer. */
88 /* Print as long, with trailing `l'. */
92 /* Print in usual way, but here to detect void. */
96 /* Information we keep for a builtin type. */
98 struct d_builtin_type_info
102 /* Type name when using Java. */
103 const char *java_name;
104 /* How to print a value of this type. */
105 enum d_builtin_type_print print;
108 /* Component types found in mangled names. */
114 /* A qualified name. */
120 /* A template parameter. */
121 D_COMP_TEMPLATE_PARAM,
128 /* A VTT structure. */
130 /* A construction vtable. */
131 D_COMP_CONSTRUCTION_VTABLE,
132 /* A typeinfo structure. */
134 /* A typeinfo name. */
135 D_COMP_TYPEINFO_NAME,
136 /* A typeinfo function. */
140 /* A virtual thunk. */
141 D_COMP_VIRTUAL_THUNK,
142 /* A covariant thunk. */
143 D_COMP_COVARIANT_THUNK,
146 /* A guard variable. */
148 /* A reference temporary. */
150 /* A standard substitution. */
152 /* The restrict qualifier. */
154 /* The volatile qualifier. */
156 /* The const qualifier. */
158 /* A vendor qualifier. */
159 D_COMP_VENDOR_TYPE_QUAL,
164 /* A complex type. */
166 /* An imaginary type. */
168 /* A builtin type. */
170 /* A vendor's builtin type. */
172 /* A function type. */
173 D_COMP_FUNCTION_TYPE,
176 /* A pointer to member type. */
178 /* An argument list. */
180 /* A template argument list. */
181 D_COMP_TEMPLATE_ARGLIST,
184 /* An extended operator. */
185 D_COMP_EXTENDED_OPERATOR,
188 /* A unary expression. */
190 /* A binary expression. */
192 /* Arguments to a binary expression. */
194 /* A trinary expression. */
196 /* Arguments to a trinary expression. */
203 /* A component of the mangled name. */
207 /* The type of this component. */
208 enum d_comp_type type;
211 /* For D_COMP_NAME. */
214 /* A pointer to the name (not NULL terminated) and it's
220 /* For D_COMP_OPERATOR. */
224 const struct d_operator_info *op;
227 /* For D_COMP_EXTENDED_OPERATOR. */
230 /* Number of arguments. */
234 } s_extended_operator;
236 /* For D_COMP_CTOR. */
239 enum gnu_v3_ctor_kinds kind;
243 /* For D_COMP_DTOR. */
246 enum gnu_v3_dtor_kinds kind;
250 /* For D_COMP_BUILTIN_TYPE. */
253 const struct d_builtin_type_info *type;
256 /* For D_COMP_SUB_STD. */
262 /* For D_COMP_TEMPLATE_PARAM. */
268 /* For other types. */
272 struct d_comp *right;
278 #define d_left(dc) ((dc)->u.s_binary.left)
279 #define d_right(dc) ((dc)->u.s_binary.right)
281 /* The information structure we pass around. */
285 /* The string we are demangling. */
287 /* The options passed to the demangler. */
289 /* The next character in the string to consider. */
291 /* The array of components. */
292 struct d_comp *comps;
293 /* The index of the next available component. */
295 /* The number of available component structures. */
297 /* The array of substitutions. */
298 struct d_comp **subs;
299 /* The index of the next substitution. */
301 /* The number of available entries in the subs array. */
303 /* The last name we saw, for constructors and destructors. */
304 struct d_comp *last_name;
307 #define d_peek_char(di) (*((di)->n))
308 #define d_peek_next_char(di) ((di)->n[1])
309 #define d_advance(di, i) ((di)->n += (i))
310 #define d_next_char(di) (*((di)->n++))
311 #define d_str(di) ((di)->n)
313 /* A list of templates. This is used while printing. */
315 struct d_print_template
317 /* Next template on the list. */
318 struct d_print_template *next;
320 const struct d_comp *template;
323 /* A list of type modifiers. This is used while printing. */
327 /* Next modifier on the list. These are in the reverse of the order
328 in which they appeared in the mangled string. */
329 struct d_print_mod *next;
331 const struct d_comp *mod;
332 /* Whether this modifier was printed. */
336 /* We use this structure to hold information during printing. */
340 /* The options passed to the demangler. */
342 /* Buffer holding the result. */
344 /* Current length of data in buffer. */
346 /* Allocated size of buffer. */
348 /* The current list of templates, if any. */
349 struct d_print_template *templates;
350 /* The current list of modifiers (e.g., pointer, reference, etc.),
352 struct d_print_mod *modifiers;
353 /* Set to 1 if we had a memory allocation failure. */
354 int allocation_failure;
357 #define d_print_saw_error(dpi) ((dpi)->buf == NULL)
359 #define d_append_char(dpi, c) \
362 if ((dpi)->buf != NULL && (dpi)->len < (dpi)->alc) \
363 (dpi)->buf[(dpi)->len++] = (c); \
365 d_print_append_char ((dpi), (c)); \
369 #define d_append_buffer(dpi, s, l) \
372 if ((dpi)->buf != NULL && (dpi)->len + (l) <= (dpi)->alc) \
374 memcpy ((dpi)->buf + (dpi)->len, (s), (l)); \
378 d_print_append_buffer ((dpi), (s), (l)); \
382 #define d_append_string(dpi, s) \
385 size_t d_append_string_len = strlen (s); \
386 d_append_buffer ((dpi), (s), d_append_string_len); \
390 #ifdef CP_DEMANGLE_DEBUG
391 static void d_dump PARAMS ((struct d_comp *, int));
393 static struct d_comp *d_make_empty PARAMS ((struct d_info *,
395 static struct d_comp *d_make_comp PARAMS ((struct d_info *, enum d_comp_type,
396 struct d_comp *, struct d_comp *));
397 static struct d_comp *d_make_name PARAMS ((struct d_info *, const char *,
399 static struct d_comp *d_make_builtin_type PARAMS ((struct d_info *,
400 const struct d_builtin_type_info *));
401 static struct d_comp *d_make_operator PARAMS ((struct d_info *,
402 const struct d_operator_info *));
403 static struct d_comp *d_make_extended_operator PARAMS ((struct d_info *,
406 static struct d_comp *d_make_ctor PARAMS ((struct d_info *,
407 enum gnu_v3_ctor_kinds,
409 static struct d_comp *d_make_dtor PARAMS ((struct d_info *,
410 enum gnu_v3_dtor_kinds,
412 static struct d_comp *d_make_template_param PARAMS ((struct d_info *, long));
413 static struct d_comp *d_make_sub PARAMS ((struct d_info *, const char *));
414 static struct d_comp *d_mangled_name PARAMS ((struct d_info *));
415 static int has_return_type PARAMS ((struct d_comp *));
416 static int is_ctor_dtor_or_conversion PARAMS ((struct d_comp *));
417 static struct d_comp *d_encoding PARAMS ((struct d_info *));
418 static struct d_comp *d_name PARAMS ((struct d_info *));
419 static struct d_comp *d_nested_name PARAMS ((struct d_info *));
420 static struct d_comp *d_prefix PARAMS ((struct d_info *));
421 static struct d_comp *d_unqualified_name PARAMS ((struct d_info *));
422 static struct d_comp *d_source_name PARAMS ((struct d_info *));
423 static long d_number PARAMS ((struct d_info *));
424 static struct d_comp *d_identifier PARAMS ((struct d_info *, int));
425 static struct d_comp *d_operator_name PARAMS ((struct d_info *));
426 static struct d_comp *d_special_name PARAMS ((struct d_info *));
427 static int d_call_offset PARAMS ((struct d_info *, int));
428 static struct d_comp *d_ctor_dtor_name PARAMS ((struct d_info *));
429 static struct d_comp *d_type PARAMS ((struct d_info *));
430 static struct d_comp **d_cv_qualifiers PARAMS ((struct d_info *,
432 static struct d_comp *d_function_type PARAMS ((struct d_info *));
433 static struct d_comp *d_bare_function_type PARAMS ((struct d_info *, int));
434 static struct d_comp *d_class_enum_type PARAMS ((struct d_info *));
435 static struct d_comp *d_array_type PARAMS ((struct d_info *));
436 static struct d_comp *d_pointer_to_member_type PARAMS ((struct d_info *));
437 static struct d_comp *d_template_param PARAMS ((struct d_info *));
438 static struct d_comp *d_template_args PARAMS ((struct d_info *));
439 static struct d_comp *d_template_arg PARAMS ((struct d_info *));
440 static struct d_comp *d_expression PARAMS ((struct d_info *));
441 static struct d_comp *d_expr_primary PARAMS ((struct d_info *));
442 static struct d_comp *d_local_name PARAMS ((struct d_info *));
443 static int d_discriminator PARAMS ((struct d_info *));
444 static int d_add_substitution PARAMS ((struct d_info *, struct d_comp *));
445 static struct d_comp *d_substitution PARAMS ((struct d_info *));
446 static void d_print_resize PARAMS ((struct d_print_info *, size_t));
447 static void d_print_append_char PARAMS ((struct d_print_info *, int));
448 static void d_print_append_buffer PARAMS ((struct d_print_info *, const char *,
450 static void d_print_error PARAMS ((struct d_print_info *));
451 static char *d_print PARAMS ((int, const struct d_comp *, size_t *));
452 static void d_print_comp PARAMS ((struct d_print_info *,
453 const struct d_comp *));
454 static void d_print_identifier PARAMS ((struct d_print_info *, const char *,
456 static void d_print_mod_list PARAMS ((struct d_print_info *,
457 struct d_print_mod *));
458 static void d_print_mod PARAMS ((struct d_print_info *,
459 const struct d_comp *));
460 static void d_print_function_type PARAMS ((struct d_print_info *,
461 const struct d_comp *,
462 struct d_print_mod *));
463 static void d_print_array_type PARAMS ((struct d_print_info *,
464 const struct d_comp *,
465 struct d_print_mod *));
466 static void d_print_expr_op PARAMS ((struct d_print_info *,
467 const struct d_comp *));
468 static void d_print_cast PARAMS ((struct d_print_info *,
469 const struct d_comp *));
470 static int d_init_info PARAMS ((const char *, int, size_t, struct d_info *));
471 static char *d_demangle PARAMS ((const char *, int, size_t *));
473 #ifdef CP_DEMANGLE_DEBUG
485 for (i = 0; i < indent; ++i)
491 printf ("name '%.*s'\n", dc->u.s_name.len, dc->u.s_name.s);
493 case D_COMP_TEMPLATE_PARAM:
494 printf ("template parameter %ld\n", dc->u.s_number.number);
497 printf ("constructor %d\n", (int) dc->u.s_ctor.kind);
498 d_dump (dc->u.s_ctor.name, indent + 2);
501 printf ("destructor %d\n", (int) dc->u.s_dtor.kind);
502 d_dump (dc->u.s_dtor.name, indent + 2);
505 printf ("standard substitution %s\n", dc->u.s_string.string);
507 case D_COMP_BUILTIN_TYPE:
508 printf ("builtin type %s\n", dc->u.s_builtin.type->name);
510 case D_COMP_OPERATOR:
511 printf ("operator %s\n", dc->u.s_operator.op->name);
513 case D_COMP_EXTENDED_OPERATOR:
514 printf ("extended operator with %d args\n",
515 dc->u.s_extended_operator.args);
516 d_dump (dc->u.s_extended_operator.name, indent + 2);
519 case D_COMP_QUAL_NAME:
520 printf ("qualified name\n");
522 case D_COMP_TYPED_NAME:
523 printf ("typed name\n");
525 case D_COMP_TEMPLATE:
526 printf ("template\n");
534 case D_COMP_CONSTRUCTION_VTABLE:
535 printf ("construction vtable\n");
537 case D_COMP_TYPEINFO:
538 printf ("typeinfo\n");
540 case D_COMP_TYPEINFO_NAME:
541 printf ("typeinfo name\n");
543 case D_COMP_TYPEINFO_FN:
544 printf ("typeinfo function\n");
549 case D_COMP_VIRTUAL_THUNK:
550 printf ("virtual thunk\n");
552 case D_COMP_COVARIANT_THUNK:
553 printf ("covariant thunk\n");
555 case D_COMP_JAVA_CLASS:
556 printf ("java class\n");
562 printf ("reference temporary\n");
564 case D_COMP_RESTRICT:
565 printf ("restrict\n");
567 case D_COMP_VOLATILE:
568 printf ("volatile\n");
573 case D_COMP_VENDOR_TYPE_QUAL:
574 printf ("vendor type qualifier\n");
577 printf ("pointer\n");
579 case D_COMP_REFERENCE:
580 printf ("reference\n");
583 printf ("complex\n");
585 case D_COMP_IMAGINARY:
586 printf ("imaginary\n");
588 case D_COMP_VENDOR_TYPE:
589 printf ("vendor type\n");
591 case D_COMP_FUNCTION_TYPE:
592 printf ("function type\n");
594 case D_COMP_ARRAY_TYPE:
595 printf ("array type\n");
597 case D_COMP_PTRMEM_TYPE:
598 printf ("pointer to member type\n");
601 printf ("argument list\n");
603 case D_COMP_TEMPLATE_ARGLIST:
604 printf ("template argument list\n");
610 printf ("unary operator\n");
613 printf ("binary operator\n");
615 case D_COMP_BINARY_ARGS:
616 printf ("binary operator arguments\n");
619 printf ("trinary operator\n");
621 case D_COMP_TRINARY_ARG1:
622 printf ("trinary operator arguments 1\n");
624 case D_COMP_TRINARY_ARG2:
625 printf ("trinary operator arguments 1\n");
628 printf ("literal\n");
632 d_dump (d_left (dc), indent + 2);
633 d_dump (d_right (dc), indent + 2);
636 #endif /* CP_DEMANGLE_DEBUG */
638 /* Add a new component. */
640 static struct d_comp *
641 d_make_empty (di, type)
643 enum d_comp_type type;
647 if (di->next_comp >= di->num_comps)
649 p = &di->comps[di->next_comp];
655 /* Add a new generic component. */
657 static struct d_comp *
658 d_make_comp (di, type, left, right)
660 enum d_comp_type type;
662 struct d_comp *right;
666 /* We check for errors here. A typical error would be a NULL return
667 from a subroutine. We catch here, and return NULL on upward. */
670 /* These types require two parameters. */
671 case D_COMP_QUAL_NAME:
672 case D_COMP_TYPED_NAME:
673 case D_COMP_TEMPLATE:
674 case D_COMP_VENDOR_TYPE_QUAL:
675 case D_COMP_PTRMEM_TYPE:
678 case D_COMP_BINARY_ARGS:
680 case D_COMP_TRINARY_ARG1:
681 case D_COMP_TRINARY_ARG2:
683 if (left == NULL || right == NULL)
687 /* These types only require one parameter. */
690 case D_COMP_CONSTRUCTION_VTABLE:
691 case D_COMP_TYPEINFO:
692 case D_COMP_TYPEINFO_NAME:
693 case D_COMP_TYPEINFO_FN:
695 case D_COMP_VIRTUAL_THUNK:
696 case D_COMP_COVARIANT_THUNK:
697 case D_COMP_JAVA_CLASS:
701 case D_COMP_REFERENCE:
703 case D_COMP_IMAGINARY:
704 case D_COMP_VENDOR_TYPE:
706 case D_COMP_TEMPLATE_ARGLIST:
712 /* This needs a right parameter, but the left parameter can be
714 case D_COMP_ARRAY_TYPE:
719 /* These are allowed to have no parameters--in some cases they
720 will be filled in later. */
721 case D_COMP_FUNCTION_TYPE:
722 case D_COMP_RESTRICT:
723 case D_COMP_VOLATILE:
727 /* Other types should not be seen here. */
732 p = d_make_empty (di, type);
735 p->u.s_binary.left = left;
736 p->u.s_binary.right = right;
741 /* Add a new name component. */
743 static struct d_comp *
744 d_make_name (di, s, len)
751 p = d_make_empty (di, D_COMP_NAME);
755 p->u.s_name.len = len;
760 /* Add a new builtin type component. */
762 static struct d_comp *
763 d_make_builtin_type (di, type)
765 const struct d_builtin_type_info *type;
769 p = d_make_empty (di, D_COMP_BUILTIN_TYPE);
771 p->u.s_builtin.type = type;
775 /* Add a new operator component. */
777 static struct d_comp *
778 d_make_operator (di, op)
780 const struct d_operator_info *op;
784 p = d_make_empty (di, D_COMP_OPERATOR);
786 p->u.s_operator.op = op;
790 /* Add a new extended operator component. */
792 static struct d_comp *
793 d_make_extended_operator (di, args, name)
800 p = d_make_empty (di, D_COMP_EXTENDED_OPERATOR);
803 p->u.s_extended_operator.args = args;
804 p->u.s_extended_operator.name = name;
809 /* Add a new constructor component. */
811 static struct d_comp *
812 d_make_ctor (di, kind, name)
814 enum gnu_v3_ctor_kinds kind;
819 p = d_make_empty (di, D_COMP_CTOR);
822 p->u.s_ctor.kind = kind;
823 p->u.s_ctor.name = name;
828 /* Add a new destructor component. */
830 static struct d_comp *
831 d_make_dtor (di, kind, name)
833 enum gnu_v3_dtor_kinds kind;
838 p = d_make_empty (di, D_COMP_DTOR);
841 p->u.s_dtor.kind = kind;
842 p->u.s_dtor.name = name;
847 /* Add a new template parameter. */
849 static struct d_comp *
850 d_make_template_param (di, i)
856 p = d_make_empty (di, D_COMP_TEMPLATE_PARAM);
858 p->u.s_number.number = i;
862 /* Add a new standard substitution component. */
864 static struct d_comp *
865 d_make_sub (di, name)
871 p = d_make_empty (di, D_COMP_SUB_STD);
873 p->u.s_string.string = name;
877 /* <mangled-name> ::= _Z <encoding> */
879 static struct d_comp *
883 if (d_next_char (di) != '_')
885 if (d_next_char (di) != 'Z')
887 return d_encoding (di);
890 /* Return whether a function should have a return type. The argument
891 is the function name, which may be qualified in various ways. The
892 rules are that template functions have return types with some
893 exceptions, function types which are not part of a function name
894 mangling have return types with some exceptions, and non-template
895 function names do not have return types. The exceptions are that
896 constructors, destructors, and conversion operators do not have
909 case D_COMP_TEMPLATE:
910 return ! is_ctor_dtor_or_conversion (d_left (dc));
911 case D_COMP_RESTRICT:
912 case D_COMP_VOLATILE:
914 case D_COMP_VENDOR_TYPE_QUAL:
915 return has_return_type (d_left (dc));
919 /* Return whether a name is a constructor, a destructor, or a
920 conversion operator. */
923 is_ctor_dtor_or_conversion (dc)
932 case D_COMP_QUAL_NAME:
933 return is_ctor_dtor_or_conversion (d_right (dc));
941 /* <encoding> ::= <(function) name> <bare-function-type>
943 ::= <special-name> */
945 static struct d_comp *
949 char peek = d_peek_char (di);
951 if (peek == 'G' || peek == 'T')
952 return d_special_name (di);
958 peek = d_peek_char (di);
959 if (peek == '\0' || peek == 'E')
961 return d_make_comp (di, D_COMP_TYPED_NAME, dc,
962 d_bare_function_type (di, has_return_type (dc)));
966 /* <name> ::= <nested-name>
968 ::= <unscoped-template-name> <template-args>
971 <unscoped-name> ::= <unqualified-name>
972 ::= St <unqualified-name>
974 <unscoped-template-name> ::= <unscoped-name>
978 static struct d_comp *
982 char peek = d_peek_char (di);
988 return d_nested_name (di);
991 return d_local_name (di);
997 if (d_peek_next_char (di) != 't')
999 dc = d_substitution (di);
1005 dc = d_make_comp (di, D_COMP_QUAL_NAME, d_make_name (di, "std", 3),
1006 d_unqualified_name (di));
1010 if (d_peek_char (di) != 'I')
1012 /* The grammar does not permit this case to occur if we
1013 called d_substitution() above (i.e., subst == 1). We
1014 don't bother to check. */
1018 /* This is <template-args>, which means that we just saw
1019 <unscoped-template-name>, which is a substitution
1020 candidate if we didn't just get it from a
1024 if (! d_add_substitution (di, dc))
1027 dc = d_make_comp (di, D_COMP_TEMPLATE, dc, d_template_args (di));
1034 dc = d_unqualified_name (di);
1035 if (d_peek_char (di) == 'I')
1037 /* This is <template-args>, which means that we just saw
1038 <unscoped-template-name>, which is a substitution
1040 if (! d_add_substitution (di, dc))
1042 dc = d_make_comp (di, D_COMP_TEMPLATE, dc, d_template_args (di));
1048 /* <nested-name> ::= N [<CV-qualifiers>] <prefix> <unqualified-name> E
1049 ::= N [<CV-qualifiers>] <template-prefix> <template-args> E
1052 static struct d_comp *
1057 struct d_comp **pret;
1059 if (d_next_char (di) != 'N')
1062 pret = d_cv_qualifiers (di, &ret);
1066 *pret = d_prefix (di);
1070 if (d_next_char (di) != 'E')
1076 /* <prefix> ::= <prefix> <unqualified-name>
1077 ::= <template-prefix> <template-args>
1078 ::= <template-param>
1082 <template-prefix> ::= <prefix> <(template) unqualified-name>
1083 ::= <template-param>
1087 static struct d_comp *
1091 struct d_comp *ret = NULL;
1096 enum d_comp_type comb_type;
1099 peek = d_peek_char (di);
1103 /* The older code accepts a <local-name> here, but I don't see
1104 that in the grammar. The older code does not accept a
1105 <template-param> here. */
1107 comb_type = D_COMP_QUAL_NAME;
1109 || (peek >= 'a' && peek <= 'z')
1112 dc = d_unqualified_name (di);
1113 else if (peek == 'S')
1114 dc = d_substitution (di);
1115 else if (peek == 'I')
1119 comb_type = D_COMP_TEMPLATE;
1120 dc = d_template_args (di);
1122 else if (peek == 'T')
1123 dc = d_template_param (di);
1124 else if (peek == 'E')
1132 ret = d_make_comp (di, comb_type, ret, dc);
1134 if (peek != 'S' && d_peek_char (di) != 'E')
1136 if (! d_add_substitution (di, ret))
1142 /* <unqualified-name> ::= <operator-name>
1143 ::= <ctor-dtor-name>
1147 static struct d_comp *
1148 d_unqualified_name (di)
1153 peek = d_peek_char (di);
1154 if (IS_DIGIT (peek))
1155 return d_source_name (di);
1156 else if (peek >= 'a' && peek <= 'z')
1157 return d_operator_name (di);
1158 else if (peek == 'C' || peek == 'D')
1159 return d_ctor_dtor_name (di);
1164 /* <source-name> ::= <(positive length) number> <identifier> */
1166 static struct d_comp *
1173 len = d_number (di);
1176 ret = d_identifier (di, len);
1177 di->last_name = ret;
1181 /* number ::= [n] <(non-negative decimal integer)> */
1192 peek = d_peek_char (di);
1197 peek = d_peek_char (di);
1203 if (! IS_DIGIT (peek))
1205 ret = ret * 10 + peek - '0';
1207 peek = d_peek_char (di);
1211 /* identifier ::= <(unqualified source code identifier)> */
1213 static struct d_comp *
1214 d_identifier (di, len)
1221 d_advance (di, len);
1223 /* Look for something which looks like a gcc encoding of an
1224 anonymous namespace, and replace it with a more user friendly
1226 if (len >= (int) ANONYMOUS_NAMESPACE_PREFIX_LEN + 2
1227 && memcmp (name, ANONYMOUS_NAMESPACE_PREFIX,
1228 ANONYMOUS_NAMESPACE_PREFIX_LEN) == 0)
1232 s = name + ANONYMOUS_NAMESPACE_PREFIX_LEN;
1233 if ((*s == '.' || *s == '_' || *s == '$')
1235 return d_make_name (di, "(anonymous namespace)",
1236 sizeof "(anonymous namespace)" - 1);
1239 return d_make_name (di, name, len);
1242 /* operator_name ::= many different two character encodings.
1244 ::= v <digit> <source-name>
1247 static const struct d_operator_info d_operators[] =
1258 { "da", "delete[]", 1 },
1260 { "dl", "delete", 1 },
1277 { "na", "new[]", 1 },
1296 { "st", "sizeof ", 1 },
1297 { "sz", "sizeof ", 1 }
1300 static struct d_comp *
1301 d_operator_name (di)
1307 c1 = d_next_char (di);
1308 c2 = d_next_char (di);
1309 if (c1 == 'v' && IS_DIGIT (c2))
1310 return d_make_extended_operator (di, c2 - '0', d_source_name (di));
1311 else if (c1 == 'c' && c2 == 'v')
1312 return d_make_comp (di, D_COMP_CAST, d_type (di), NULL);
1316 int high = sizeof (d_operators) / sizeof (d_operators[0]);
1321 const struct d_operator_info *p;
1323 i = low + (high - low) / 2;
1324 p = d_operators + i;
1326 if (c1 == p->code[0] && c2 == p->code[1])
1327 return d_make_operator (di, p);
1329 if (c1 < p->code[0] || (c1 == p->code[0] && c2 < p->code[1]))
1339 /* <special-name> ::= TV <type>
1343 ::= GV <(object) name>
1344 ::= T <call-offset> <(base) encoding>
1345 ::= Tc <call-offset> <call-offset> <(base) encoding>
1346 Also g++ extensions:
1347 ::= TC <type> <(offset) number> _ <(base) type>
1353 static struct d_comp *
1359 c = d_next_char (di);
1362 switch (d_next_char (di))
1365 return d_make_comp (di, D_COMP_VTABLE, d_type (di), NULL);
1367 return d_make_comp (di, D_COMP_VTT, d_type (di), NULL);
1369 return d_make_comp (di, D_COMP_TYPEINFO, d_type (di), NULL);
1371 return d_make_comp (di, D_COMP_TYPEINFO_NAME, d_type (di), NULL);
1374 if (! d_call_offset (di, 'h'))
1376 return d_make_comp (di, D_COMP_THUNK, d_encoding (di), NULL);
1379 if (! d_call_offset (di, 'v'))
1381 return d_make_comp (di, D_COMP_VIRTUAL_THUNK, d_encoding (di),
1385 if (! d_call_offset (di, '\0'))
1387 if (! d_call_offset (di, '\0'))
1389 return d_make_comp (di, D_COMP_COVARIANT_THUNK, d_encoding (di),
1394 struct d_comp *derived_type;
1396 struct d_comp *base_type;
1398 derived_type = d_type (di);
1399 offset = d_number (di);
1402 if (d_next_char (di) != '_')
1404 base_type = d_type (di);
1405 /* We don't display the offset. FIXME: We should display
1406 it in verbose mode. */
1407 return d_make_comp (di, D_COMP_CONSTRUCTION_VTABLE, base_type,
1412 return d_make_comp (di, D_COMP_TYPEINFO_FN, d_type (di), NULL);
1414 return d_make_comp (di, D_COMP_JAVA_CLASS, d_type (di), NULL);
1422 switch (d_next_char (di))
1425 return d_make_comp (di, D_COMP_GUARD, d_name (di), NULL);
1428 return d_make_comp (di, D_COMP_REFTEMP, d_name (di), NULL);
1438 /* <call-offset> ::= h <nv-offset> _
1441 <nv-offset> ::= <(offset) number>
1443 <v-offset> ::= <(offset) number> _ <(virtual offset) number>
1445 The C parameter, if not '\0', is a character we just read which is
1446 the start of the <call-offset>.
1448 We don't display the offset information anywhere. FIXME: We should
1449 display it in verbose mode. */
1452 d_call_offset (di, c)
1457 long virtual_offset;
1460 c = d_next_char (di);
1463 offset = d_number (di);
1466 offset = d_number (di);
1467 if (d_next_char (di) != '_')
1469 virtual_offset = d_number (di);
1474 if (d_next_char (di) != '_')
1480 /* <ctor-dtor-name> ::= C1
1488 static struct d_comp *
1489 d_ctor_dtor_name (di)
1492 switch (d_next_char (di))
1496 enum gnu_v3_ctor_kinds kind;
1498 switch (d_next_char (di))
1501 kind = gnu_v3_complete_object_ctor;
1504 kind = gnu_v3_base_object_ctor;
1507 kind = gnu_v3_complete_object_allocating_ctor;
1512 return d_make_ctor (di, kind, di->last_name);
1517 enum gnu_v3_dtor_kinds kind;
1519 switch (d_next_char (di))
1522 kind = gnu_v3_deleting_dtor;
1525 kind = gnu_v3_complete_object_dtor;
1528 kind = gnu_v3_base_object_dtor;
1533 return d_make_dtor (di, kind, di->last_name);
1541 /* <type> ::= <builtin-type>
1543 ::= <class-enum-type>
1545 ::= <pointer-to-member-type>
1546 ::= <template-param>
1547 ::= <template-template-param> <template-args>
1549 ::= <CV-qualifiers> <type>
1554 ::= U <source-name> <type>
1556 <builtin-type> ::= various one letter codes
1560 static const struct d_builtin_type_info d_builtin_types[26] =
1562 /* a */ { "signed char", "signed char", D_PRINT_INT },
1563 /* b */ { "bool", "boolean", D_PRINT_BOOL },
1564 /* c */ { "char", "byte", D_PRINT_INT },
1565 /* d */ { "double", "double", D_PRINT_DEFAULT },
1566 /* e */ { "long double", "long double", D_PRINT_DEFAULT },
1567 /* f */ { "float", "float", D_PRINT_DEFAULT },
1568 /* g */ { "__float128", "__float128", D_PRINT_DEFAULT },
1569 /* h */ { "unsigned char", "unsigned char", D_PRINT_INT },
1570 /* i */ { "int", "int", D_PRINT_INT },
1571 /* j */ { "unsigned int", "unsigned", D_PRINT_INT },
1572 /* k */ { NULL, NULL, D_PRINT_DEFAULT },
1573 /* l */ { "long", "long", D_PRINT_LONG },
1574 /* m */ { "unsigned long", "unsigned long", D_PRINT_LONG },
1575 /* n */ { "__int128", "__int128", D_PRINT_DEFAULT },
1576 /* o */ { "unsigned __int128", "unsigned __int128", D_PRINT_DEFAULT },
1577 /* p */ { NULL, NULL, D_PRINT_DEFAULT },
1578 /* q */ { NULL, NULL, D_PRINT_DEFAULT },
1579 /* r */ { NULL, NULL, D_PRINT_DEFAULT },
1580 /* s */ { "short", "short", D_PRINT_INT },
1581 /* t */ { "unsigned short", "unsigned short", D_PRINT_INT },
1582 /* u */ { NULL, NULL, D_PRINT_DEFAULT },
1583 /* v */ { "void", "void", D_PRINT_VOID },
1584 /* w */ { "wchar_t", "char", D_PRINT_INT },
1585 /* x */ { "long long", "long", D_PRINT_DEFAULT },
1586 /* y */ { "unsigned long long", "unsigned long long", D_PRINT_DEFAULT },
1587 /* z */ { "...", "...", D_PRINT_DEFAULT },
1590 static struct d_comp *
1598 /* The ABI specifies that when CV-qualifiers are used, the base type
1599 is substitutable, and the fully qualified type is substitutable,
1600 but the base type with a strict subset of the CV-qualifiers is
1601 not substitutable. The natural recursive implementation of the
1602 CV-qualifiers would cause subsets to be substitutable, so instead
1603 we pull them all off now.
1605 FIXME: The ABI specifies that vendor qualifiers are handled just
1606 like the standard CV-qualifiers with respect to subsetting and
1607 substitution, but g++ does not appear to work this way. */
1609 peek = d_peek_char (di);
1610 if (peek == 'r' || peek == 'V' || peek == 'K')
1612 struct d_comp **pret;
1614 pret = d_cv_qualifiers (di, &ret);
1615 *pret = d_type (di);
1616 if (! d_add_substitution (di, ret))
1625 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
1626 case 'h': case 'i': case 'j': case 'l': case 'm': case 'n':
1627 case 'o': case 's': case 't':
1628 case 'v': case 'w': case 'x': case 'y': case 'z':
1629 /* FIXME: The old demangler handles Java types here. */
1630 ret = d_make_builtin_type (di, &d_builtin_types[peek - 'a']);
1637 ret = d_make_comp (di, D_COMP_VENDOR_TYPE, d_source_name (di), NULL);
1641 ret = d_function_type (di);
1644 case '0': case '1': case '2': case '3': case '4':
1645 case '5': case '6': case '7': case '8': case '9':
1648 ret = d_class_enum_type (di);
1652 ret = d_array_type (di);
1656 ret = d_pointer_to_member_type (di);
1660 ret = d_template_param (di);
1661 if (d_peek_char (di) == 'I')
1663 /* This is <template-template-param> <template-args>. The
1664 <template-template-param> part is a substitution
1666 if (! d_add_substitution (di, ret))
1668 ret = d_make_comp (di, D_COMP_TEMPLATE, ret, d_template_args (di));
1673 /* If this is a special substitution, then it is the start of
1674 <class-enum-type>. */
1678 peek_next = d_peek_next_char (di);
1679 if (IS_DIGIT (peek_next)
1681 || (peek_next >= 'A' && peek_next <= 'Z'))
1683 ret = d_substitution (di);
1684 /* The substituted name may have been a template name and
1685 may be followed by tepmlate args. */
1686 if (d_peek_char (di) == 'I')
1687 ret = d_make_comp (di, D_COMP_TEMPLATE, ret,
1688 d_template_args (di));
1694 ret = d_class_enum_type (di);
1695 /* If the substitution was a complete type, then it is not
1696 a new substitution candidate. However, if the
1697 substitution was followed by template arguments, then
1698 the whole thing is a substitution candidate. */
1699 if (ret->type == D_COMP_SUB_STD)
1707 ret = d_make_comp (di, D_COMP_POINTER, d_type (di), NULL);
1712 ret = d_make_comp (di, D_COMP_REFERENCE, d_type (di), NULL);
1717 ret = d_make_comp (di, D_COMP_COMPLEX, d_type (di), NULL);
1722 ret = d_make_comp (di, D_COMP_IMAGINARY, d_type (di), NULL);
1727 ret = d_source_name (di);
1728 ret = d_make_comp (di, D_COMP_VENDOR_TYPE_QUAL, d_type (di), ret);
1737 if (! d_add_substitution (di, ret))
1744 /* <CV-qualifiers> ::= [r] [V] [K] */
1746 static struct d_comp **
1747 d_cv_qualifiers (di, pret)
1749 struct d_comp **pret;
1753 peek = d_peek_char (di);
1754 while (peek == 'r' || peek == 'V' || peek == 'K')
1760 t = D_COMP_RESTRICT;
1761 else if (peek == 'V')
1762 t = D_COMP_VOLATILE;
1766 *pret = d_make_comp (di, t, NULL, NULL);
1769 pret = &d_left (*pret);
1771 peek = d_peek_char (di);
1777 /* <function-type> ::= F [Y] <bare-function-type> E */
1779 static struct d_comp *
1780 d_function_type (di)
1785 if (d_next_char (di) != 'F')
1787 if (d_peek_char (di) == 'Y')
1789 /* Function has C linkage. We don't print this information.
1790 FIXME: We should print it in verbose mode. */
1793 ret = d_bare_function_type (di, 1);
1794 if (d_next_char (di) != 'E')
1799 /* <bare-function-type> ::= <type>+ */
1801 static struct d_comp *
1802 d_bare_function_type (di, has_return_type)
1804 int has_return_type;
1806 struct d_comp *return_type;
1808 struct d_comp **ptl;
1816 struct d_comp *type;
1818 peek = d_peek_char (di);
1819 if (peek == '\0' || peek == 'E')
1824 if (has_return_type)
1827 has_return_type = 0;
1831 *ptl = d_make_comp (di, D_COMP_ARGLIST, type, NULL);
1832 ptl = &d_right (*ptl);
1836 /* There should be at least one parameter type besides the optional
1837 return type. A function which takes no arguments will have a
1838 single parameter type void. */
1842 /* If we have a single parameter type void, omit it. */
1843 if (d_right (tl) == NULL
1844 && d_left (tl)->type == D_COMP_BUILTIN_TYPE
1845 && d_left (tl)->u.s_builtin.type->print == D_PRINT_VOID)
1848 return d_make_comp (di, D_COMP_FUNCTION_TYPE, return_type, tl);
1851 /* <class-enum-type> ::= <name> */
1853 static struct d_comp *
1854 d_class_enum_type (di)
1860 /* <array-type> ::= A <(positive dimension) number> _ <(element) type>
1861 ::= A [<(dimension) expression>] _ <(element) type>
1864 static struct d_comp *
1871 if (d_next_char (di) != 'A')
1874 peek = d_peek_char (di);
1877 else if (IS_DIGIT (peek))
1885 peek = d_peek_char (di);
1887 while (IS_DIGIT (peek));
1888 dim = d_make_name (di, s, d_str (di) - s);
1892 dim = d_expression (di);
1897 if (d_next_char (di) != '_')
1900 return d_make_comp (di, D_COMP_ARRAY_TYPE, dim, d_type (di));
1903 /* <pointer-to-member-type> ::= M <(class) type> <(member) type> */
1905 static struct d_comp *
1906 d_pointer_to_member_type (di)
1911 struct d_comp **pmem;
1913 if (d_next_char (di) != 'M')
1918 /* The ABI specifies that any type can be a substitution source, and
1919 that M is followed by two types, and that when a CV-qualified
1920 type is seen both the base type and the CV-qualified types are
1921 substitution sources. The ABI also specifies that for a pointer
1922 to a CV-qualified member function, the qualifiers are attached to
1923 the second type. Given the grammar, a plain reading of the ABI
1924 suggests that both the CV-qualified member function and the
1925 non-qualified member function are substitution sources. However,
1926 g++ does not work that way. g++ treats only the CV-qualified
1927 member function as a substitution source. FIXME. So to work
1928 with g++, we need to pull off the CV-qualifiers here, in order to
1929 avoid calling add_substitution() in d_type(). */
1931 pmem = d_cv_qualifiers (di, &mem);
1932 *pmem = d_type (di);
1934 return d_make_comp (di, D_COMP_PTRMEM_TYPE, cl, mem);
1937 /* <template-param> ::= T_
1938 ::= T <(parameter-2 non-negative) number> _
1941 static struct d_comp *
1942 d_template_param (di)
1947 if (d_next_char (di) != 'T')
1950 if (d_peek_char (di) == '_')
1954 param = d_number (di);
1960 if (d_next_char (di) != '_')
1963 return d_make_template_param (di, param);
1966 /* <template-args> ::= I <template-arg>+ E */
1968 static struct d_comp *
1969 d_template_args (di)
1972 struct d_comp *hold_last_name;
1974 struct d_comp **pal;
1976 /* Preserve the last name we saw--don't let the template arguments
1977 clobber it, as that would give us the wrong name for a subsequent
1978 constructor or destructor. */
1979 hold_last_name = di->last_name;
1981 if (d_next_char (di) != 'I')
1990 a = d_template_arg (di);
1994 *pal = d_make_comp (di, D_COMP_TEMPLATE_ARGLIST, a, NULL);
1995 pal = &d_right (*pal);
1997 if (d_peek_char (di) == 'E')
2004 di->last_name = hold_last_name;
2009 /* <template-arg> ::= <type>
2010 ::= X <expression> E
2014 static struct d_comp *
2020 switch (d_peek_char (di))
2024 ret = d_expression (di);
2025 if (d_next_char (di) != 'E')
2030 return d_expr_primary (di);
2037 /* <expression> ::= <(unary) operator-name> <expression>
2038 ::= <(binary) operator-name> <expression> <expression>
2039 ::= <(trinary) operator-name> <expression> <expression> <expression>
2041 ::= <template-param>
2042 ::= sr <type> <unqualified-name>
2043 ::= sr <type> <unqualified-name> <template-args>
2047 static struct d_comp *
2053 peek = d_peek_char (di);
2055 return d_expr_primary (di);
2056 else if (peek == 'T')
2057 return d_template_param (di);
2058 else if (peek == 's' && d_peek_next_char (di) == 'r')
2060 struct d_comp *type;
2061 struct d_comp *name;
2065 name = d_unqualified_name (di);
2066 if (d_peek_char (di) != 'I')
2067 return d_make_comp (di, D_COMP_QUAL_NAME, type, name);
2069 return d_make_comp (di, D_COMP_QUAL_NAME, type,
2070 d_make_comp (di, D_COMP_TEMPLATE, name,
2071 d_template_args (di)));
2078 op = d_operator_name (di);
2082 if (op->type == D_COMP_OPERATOR
2083 && strcmp (op->u.s_operator.op->code, "st") == 0)
2084 return d_make_comp (di, D_COMP_UNARY, op, d_type (di));
2090 case D_COMP_OPERATOR:
2091 args = op->u.s_operator.op->args;
2093 case D_COMP_EXTENDED_OPERATOR:
2094 args = op->u.s_extended_operator.args;
2104 return d_make_comp (di, D_COMP_UNARY, op, d_expression (di));
2107 struct d_comp *left;
2109 left = d_expression (di);
2110 return d_make_comp (di, D_COMP_BINARY, op,
2111 d_make_comp (di, D_COMP_BINARY_ARGS, left,
2112 d_expression (di)));
2116 struct d_comp *first;
2117 struct d_comp *second;
2119 first = d_expression (di);
2120 second = d_expression (di);
2121 return d_make_comp (di, D_COMP_TRINARY, op,
2122 d_make_comp (di, D_COMP_TRINARY_ARG1, first,
2124 D_COMP_TRINARY_ARG2,
2126 d_expression (di))));
2134 /* <expr-primary> ::= L <type> <(value) number> E
2135 ::= L <type> <(value) float> E
2136 ::= L <mangled-name> E
2139 static struct d_comp *
2145 if (d_next_char (di) != 'L')
2147 if (d_peek_char (di) == '_')
2148 ret = d_mangled_name (di);
2151 struct d_comp *type;
2156 /* Rather than try to interpret the literal value, we just
2157 collect it as a string. Note that it's possible to have a
2158 floating point literal here. The ABI specifies that the
2159 format of such literals is machine independent. That's fine,
2160 but what's not fine is that versions of g++ up to 3.2 with
2161 -fabi-version=1 used upper case letters in the hex constant,
2162 and dumped out gcc's internal representation. That makes it
2163 hard to tell where the constant ends, and hard to dump the
2164 constant in any readable form anyhow. We don't attempt to
2165 handle these cases. */
2168 while (d_peek_char (di) != 'E')
2170 ret = d_make_comp (di, D_COMP_LITERAL, type,
2171 d_make_name (di, s, d_str (di) - s));
2173 if (d_next_char (di) != 'E')
2178 /* <local-name> ::= Z <(function) encoding> E <(entity) name> [<discriminator>]
2179 ::= Z <(function) encoding> E s [<discriminator>]
2182 static struct d_comp *
2186 struct d_comp *function;
2188 if (d_next_char (di) != 'Z')
2191 function = d_encoding (di);
2193 if (d_next_char (di) != 'E')
2196 if (d_peek_char (di) == 's')
2199 if (! d_discriminator (di))
2201 return d_make_comp (di, D_COMP_QUAL_NAME, function,
2202 d_make_name (di, "string literal",
2203 sizeof "string literal" - 1));
2207 struct d_comp *name;
2210 if (! d_discriminator (di))
2212 return d_make_comp (di, D_COMP_QUAL_NAME, function, name);
2216 /* <discriminator> ::= _ <(non-negative) number>
2218 We demangle the discriminator, but we don't print it out. FIXME:
2219 We should print it out in verbose mode. */
2222 d_discriminator (di)
2227 if (d_peek_char (di) != '_')
2230 discrim = d_number (di);
2236 /* Add a new substitution. */
2239 d_add_substitution (di, dc)
2243 if (di->next_sub >= di->num_subs)
2245 di->subs[di->next_sub] = dc;
2250 /* <substitution> ::= S <seq-id> _
2261 static struct d_comp *
2267 if (d_next_char (di) != 'S')
2270 c = d_next_char (di);
2271 if (c == '_' || IS_DIGIT (c) || (c >= 'A' && c <= 'Z'))
2281 id = id * 36 + c - '0';
2282 else if (c >= 'A' && c <= 'Z')
2283 id = id * 36 + c - 'A' + 10;
2286 c = d_next_char (di);
2293 if (id >= di->next_sub)
2296 return di->subs[id];
2303 return d_make_sub (di, "std");
2305 di->last_name = d_make_sub (di, "allocator");
2306 return d_make_sub (di, "std::allocator");
2308 di->last_name = d_make_sub (di, "basic_string");
2309 return d_make_sub (di, "std::basic_string");
2311 di->last_name = d_make_sub (di, "string");
2312 return d_make_sub (di, "std::string");
2314 di->last_name = d_make_sub (di, "istream");
2315 return d_make_sub (di, "std::istream");
2317 di->last_name = d_make_sub (di, "ostream");
2318 return d_make_sub (di, "std::ostream");
2320 di->last_name = d_make_sub (di, "iostream");
2321 return d_make_sub (di, "std::iostream");
2328 /* Resize the print buffer. */
2331 d_print_resize (dpi, add)
2332 struct d_print_info *dpi;
2337 need = dpi->len + add;
2338 while (need > dpi->alc)
2343 newalc = dpi->alc * 2;
2344 newbuf = realloc (dpi->buf, newalc);
2349 dpi->allocation_failure = 1;
2357 /* Append a character to the print buffer. */
2360 d_print_append_char (dpi, c)
2361 struct d_print_info *dpi;
2364 if (dpi->buf != NULL)
2366 if (dpi->len >= dpi->alc)
2368 d_print_resize (dpi, 1);
2369 if (dpi->buf == NULL)
2373 dpi->buf[dpi->len] = c;
2378 /* Append a buffer to the print buffer. */
2381 d_print_append_buffer (dpi, s, l)
2382 struct d_print_info *dpi;
2386 if (dpi->buf != NULL)
2388 if (dpi->len + l > dpi->alc)
2390 d_print_resize (dpi, l);
2391 if (dpi->buf == NULL)
2395 memcpy (dpi->buf + dpi->len, s, l);
2400 /* Indicate that an error occurred during printing. */
2404 struct d_print_info *dpi;
2410 /* Turn components into a human readable string. Returns a string
2411 allocated by malloc, or NULL on error. On success, this sets *PALC
2412 to the size of the allocated buffer. On failure, this sets *PALC
2413 to 0 for a bad parse, or to 1 for a memory allocation failure. */
2416 d_print (options, dc, palc)
2418 const struct d_comp *dc;
2421 struct d_print_info dpi;
2423 dpi.options = options;
2426 dpi.buf = malloc (dpi.alc);
2427 if (dpi.buf == NULL)
2434 dpi.templates = NULL;
2435 dpi.modifiers = NULL;
2437 dpi.allocation_failure = 0;
2439 d_print_comp (&dpi, dc);
2441 d_append_char (&dpi, '\0');
2443 if (dpi.buf != NULL)
2446 *palc = dpi.allocation_failure;
2451 /* Subroutine to handle components. */
2454 d_print_comp (dpi, dc)
2455 struct d_print_info *dpi;
2456 const struct d_comp *dc;
2460 d_print_error (dpi);
2463 if (d_print_saw_error (dpi))
2469 d_print_identifier (dpi, dc->u.s_name.s, dc->u.s_name.len);
2472 case D_COMP_QUAL_NAME:
2473 d_print_comp (dpi, d_left (dc));
2474 d_append_string (dpi, (dpi->options & DMGL_JAVA) == 0 ? "::" : ".");
2475 d_print_comp (dpi, d_right (dc));
2478 case D_COMP_TYPED_NAME:
2480 const struct d_comp *typed_name;
2481 struct d_print_mod dpm;
2482 struct d_print_template dpt;
2484 /* Pass the name down to the type so that it can be printed in
2485 the right place for the type. If the name has
2486 CV-qualifiers, they are really method qualifiers; pull them
2487 off now and print them after everything else. Note that we
2488 don't handle D_COMP_VENDOR_TYPE_QUAL here; it's not
2489 accepted by d_cv_qualifiers() either. */
2490 typed_name = d_left (dc);
2491 while (typed_name != NULL
2492 && (typed_name->type == D_COMP_RESTRICT
2493 || typed_name->type == D_COMP_VOLATILE
2494 || typed_name->type == D_COMP_CONST))
2495 typed_name = d_left (typed_name);
2497 dpm.next = dpi->modifiers;
2498 dpi->modifiers = &dpm;
2499 dpm.mod = typed_name;
2502 /* If typed_name is a template, then it applies to the
2503 function type as well. */
2504 if (typed_name->type == D_COMP_TEMPLATE)
2506 dpt.next = dpi->templates;
2507 dpi->templates = &dpt;
2508 dpt.template = typed_name;
2511 d_print_comp (dpi, d_right (dc));
2513 if (typed_name->type == D_COMP_TEMPLATE)
2514 dpi->templates = dpt.next;
2516 /* If the modifier didn't get printed by the type, print it
2520 d_append_char (dpi, ' ');
2521 d_print_comp (dpi, typed_name);
2524 dpi->modifiers = dpm.next;
2526 /* Now print any CV-qualifiers on the type. */
2527 typed_name = d_left (dc);
2528 while (typed_name != NULL
2529 && (typed_name->type == D_COMP_RESTRICT
2530 || typed_name->type == D_COMP_VOLATILE
2531 || typed_name->type == D_COMP_CONST))
2533 d_print_mod (dpi, typed_name);
2534 typed_name = d_left (typed_name);
2540 case D_COMP_TEMPLATE:
2541 d_print_comp (dpi, d_left (dc));
2542 d_append_char (dpi, '<');
2543 d_print_comp (dpi, d_right (dc));
2544 /* Avoid generating two consecutive '>' characters, to avoid the
2545 C++ syntactic ambiguity. */
2546 if (dpi->buf[dpi->len - 1] == '>')
2547 d_append_char (dpi, ' ');
2548 d_append_char (dpi, '>');
2551 case D_COMP_TEMPLATE_PARAM:
2555 struct d_print_template *hold_dpt;
2557 if (dpi->templates == NULL)
2559 d_print_error (dpi);
2562 i = dc->u.s_number.number;
2563 for (a = d_right (dpi->templates->template);
2567 if (a->type != D_COMP_TEMPLATE_ARGLIST)
2569 d_print_error (dpi);
2576 if (i != 0 || a == NULL)
2578 d_print_error (dpi);
2582 /* While processing this parameter, we need to pop the list of
2583 templates. This is because the template parameter may
2584 itself be a reference to a parameter of an outer
2587 hold_dpt = dpi->templates;
2588 dpi->templates = hold_dpt->next;
2590 d_print_comp (dpi, d_left (a));
2592 dpi->templates = hold_dpt;
2598 d_print_comp (dpi, dc->u.s_ctor.name);
2602 d_append_char (dpi, '~');
2603 d_print_comp (dpi, dc->u.s_dtor.name);
2607 d_append_string (dpi, "vtable for ");
2608 d_print_comp (dpi, d_left (dc));
2612 d_append_string (dpi, "VTT for ");
2613 d_print_comp (dpi, d_left (dc));
2616 case D_COMP_CONSTRUCTION_VTABLE:
2617 d_append_string (dpi, "construction vtable for ");
2618 d_print_comp (dpi, d_left (dc));
2619 d_append_string (dpi, "-in-");
2620 d_print_comp (dpi, d_right (dc));
2623 case D_COMP_TYPEINFO:
2624 d_append_string (dpi, "typeinfo for ");
2625 d_print_comp (dpi, d_left (dc));
2628 case D_COMP_TYPEINFO_NAME:
2629 d_append_string (dpi, "typeinfo name for ");
2630 d_print_comp (dpi, d_left (dc));
2633 case D_COMP_TYPEINFO_FN:
2634 d_append_string (dpi, "typeinfo fn for ");
2635 d_print_comp (dpi, d_left (dc));
2639 d_append_string (dpi, "non-virtual thunk to ");
2640 d_print_comp (dpi, d_left (dc));
2643 case D_COMP_VIRTUAL_THUNK:
2644 d_append_string (dpi, "virtual thunk to ");
2645 d_print_comp (dpi, d_left (dc));
2648 case D_COMP_COVARIANT_THUNK:
2649 d_append_string (dpi, "covariant return thunk to ");
2650 d_print_comp (dpi, d_left (dc));
2653 case D_COMP_JAVA_CLASS:
2654 d_append_string (dpi, "java Class for ");
2655 d_print_comp (dpi, d_left (dc));
2659 d_append_string (dpi, "guard variable for ");
2660 d_print_comp (dpi, d_left (dc));
2663 case D_COMP_REFTEMP:
2664 d_append_string (dpi, "reference temporary for ");
2665 d_print_comp (dpi, d_left (dc));
2668 case D_COMP_SUB_STD:
2669 d_append_string (dpi, dc->u.s_string.string);
2672 case D_COMP_RESTRICT:
2673 case D_COMP_VOLATILE:
2675 case D_COMP_VENDOR_TYPE_QUAL:
2676 case D_COMP_POINTER:
2677 case D_COMP_REFERENCE:
2678 case D_COMP_COMPLEX:
2679 case D_COMP_IMAGINARY:
2681 /* We keep a list of modifiers on the stack. */
2682 struct d_print_mod dpm;
2684 dpm.next = dpi->modifiers;
2685 dpi->modifiers = &dpm;
2689 d_print_comp (dpi, d_left (dc));
2691 /* If the modifier didn't get printed by the type, print it
2694 d_print_mod (dpi, dc);
2696 dpi->modifiers = dpm.next;
2701 case D_COMP_BUILTIN_TYPE:
2702 if ((dpi->options & DMGL_JAVA) == 0)
2703 d_append_string (dpi, dc->u.s_builtin.type->name);
2705 d_append_string (dpi, dc->u.s_builtin.type->java_name);
2708 case D_COMP_VENDOR_TYPE:
2709 d_print_comp (dpi, d_left (dc));
2712 case D_COMP_FUNCTION_TYPE:
2714 if (d_left (dc) != NULL)
2716 struct d_print_mod dpm;
2718 /* We must pass this type down as a modifier in order to
2719 print it in the right location. */
2721 dpm.next = dpi->modifiers;
2722 dpi->modifiers = &dpm;
2726 d_print_comp (dpi, d_left (dc));
2728 dpi->modifiers = dpm.next;
2733 d_append_char (dpi, ' ');
2736 d_print_function_type (dpi, dc, dpi->modifiers);
2741 case D_COMP_ARRAY_TYPE:
2743 struct d_print_mod dpm;
2745 /* We must pass this type down as a modifier in order to print
2746 multi-dimensional arrays correctly. */
2748 dpm.next = dpi->modifiers;
2749 dpi->modifiers = &dpm;
2753 d_print_comp (dpi, d_right (dc));
2755 dpi->modifiers = dpm.next;
2760 d_print_array_type (dpi, dc, dpi->modifiers);
2765 case D_COMP_PTRMEM_TYPE:
2767 const struct d_comp *target_type;
2768 struct d_print_mod dpm;
2770 /* Pass the name down to the type so that it can be printed in
2771 the right place for the type. If the type has
2772 CV-qualifiers, they are really method qualifiers; pull them
2773 off now and print them after everything else. */
2774 target_type = d_right (dc);
2775 while (target_type != NULL
2776 && (target_type->type == D_COMP_RESTRICT
2777 || target_type->type == D_COMP_VOLATILE
2778 || target_type->type == D_COMP_CONST))
2779 target_type = d_left (target_type);
2781 dpm.next = dpi->modifiers;
2782 dpi->modifiers = &dpm;
2786 d_print_comp (dpi, target_type);
2788 /* If the modifier didn't get printed by the type, print it
2792 d_append_char (dpi, ' ');
2793 d_print_comp (dpi, d_left (dc));
2794 d_append_string (dpi, "::*");
2797 dpi->modifiers = dpm.next;
2799 /* Now print any CV-qualifiers on the type. */
2800 target_type = d_right (dc);
2801 while (target_type != NULL
2802 && (target_type->type == D_COMP_RESTRICT
2803 || target_type->type == D_COMP_VOLATILE
2804 || target_type->type == D_COMP_CONST))
2806 d_print_mod (dpi, target_type);
2807 target_type = d_left (target_type);
2813 case D_COMP_ARGLIST:
2814 case D_COMP_TEMPLATE_ARGLIST:
2815 d_print_comp (dpi, d_left (dc));
2816 if (d_right (dc) != NULL)
2818 d_append_string (dpi, ", ");
2819 d_print_comp (dpi, d_right (dc));
2823 case D_COMP_OPERATOR:
2827 d_append_string (dpi, "operator");
2828 c = dc->u.s_operator.op->name[0];
2829 if (c >= 'a' && c <= 'z')
2830 d_append_char (dpi, ' ');
2831 d_append_string (dpi, dc->u.s_operator.op->name);
2835 case D_COMP_EXTENDED_OPERATOR:
2836 d_append_string (dpi, "operator ");
2837 d_print_comp (dpi, dc->u.s_extended_operator.name);
2841 d_append_string (dpi, "operator ");
2842 d_print_cast (dpi, dc);
2846 if (d_left (dc)->type != D_COMP_CAST)
2847 d_print_expr_op (dpi, d_left (dc));
2850 d_append_string (dpi, "((");
2851 d_print_cast (dpi, d_left (dc));
2852 d_append_char (dpi, ')');
2854 d_append_char (dpi, '(');
2855 d_print_comp (dpi, d_right (dc));
2856 d_append_char (dpi, ')');
2857 if (d_left (dc)->type == D_COMP_CAST)
2858 d_append_char (dpi, ')');
2862 if (d_right (dc)->type != D_COMP_BINARY_ARGS)
2864 d_print_error (dpi);
2867 d_append_char (dpi, '(');
2868 d_print_comp (dpi, d_left (d_right (dc)));
2869 d_append_string (dpi, ") ");
2870 d_print_expr_op (dpi, d_left (dc));
2871 d_append_string (dpi, " (");
2872 d_print_comp (dpi, d_right (d_right (dc)));
2873 d_append_char (dpi, ')');
2876 case D_COMP_BINARY_ARGS:
2877 /* We should only see this as part of D_COMP_BINARY. */
2878 d_print_error (dpi);
2881 case D_COMP_TRINARY:
2882 if (d_right (dc)->type != D_COMP_TRINARY_ARG1
2883 || d_right (d_right (dc))->type != D_COMP_TRINARY_ARG2)
2885 d_print_error (dpi);
2888 d_append_char (dpi, '(');
2889 d_print_comp (dpi, d_left (d_right (dc)));
2890 d_append_string (dpi, ") ");
2891 d_print_expr_op (dpi, d_left (dc));
2892 d_append_string (dpi, " (");
2893 d_print_comp (dpi, d_left (d_right (d_right (dc))));
2894 d_append_string (dpi, ") : (");
2895 d_print_comp (dpi, d_right (d_right (d_right (dc))));
2896 d_append_char (dpi, ')');
2899 case D_COMP_TRINARY_ARG1:
2900 case D_COMP_TRINARY_ARG2:
2901 /* We should only see these are part of D_COMP_TRINARY. */
2902 d_print_error (dpi);
2905 case D_COMP_LITERAL:
2906 /* For some builtin types, produce simpler output. */
2907 if (d_left (dc)->type == D_COMP_BUILTIN_TYPE)
2909 switch (d_left (dc)->u.s_builtin.type->print)
2912 if (d_right (dc)->type == D_COMP_NAME)
2914 d_print_comp (dpi, d_right (dc));
2920 if (d_right (dc)->type == D_COMP_NAME)
2922 d_print_comp (dpi, d_right (dc));
2923 d_append_char (dpi, 'l');
2929 if (d_right (dc)->type == D_COMP_NAME
2930 && d_right (dc)->u.s_name.len == 1)
2932 switch (d_right (dc)->u.s_name.s[0])
2935 d_append_string (dpi, "false");
2938 d_append_string (dpi, "true");
2951 d_append_char (dpi, '(');
2952 d_print_comp (dpi, d_left (dc));
2953 d_append_char (dpi, ')');
2954 d_print_comp (dpi, d_right (dc));
2958 d_print_error (dpi);
2963 /* Print an identifier. */
2966 d_print_identifier (dpi, name, len)
2967 struct d_print_info *dpi;
2971 if ((dpi->options & DMGL_JAVA) == 0)
2972 d_append_buffer (dpi, name, len);
2978 /* For Java we try to handle encoded extended Unicode
2979 characters. The C++ ABI doesn't mention Unicode encoding, so
2980 we don't it for C++. Characters are encoded as
2983 for (p = name; p < end; ++p)
2994 for (q = p + 3; q < end; ++q)
2998 if (*q >= '0' && *q <= '9')
3000 else if (*q >= 'A' && *q <= 'F')
3001 dig = *q - 'A' + 10;
3002 else if (*q >= 'a' && *q <= 'f')
3003 dig = *q - 'a' + 10;
3009 /* If the Unicode character is larger than 256, we don't
3010 try to deal with it here. FIXME. */
3011 if (q < end && *q == '_' && c < 256)
3013 d_append_char (dpi, c);
3019 d_append_char (dpi, *p);
3024 /* Print a list of modifiers. */
3027 d_print_mod_list (dpi, mods)
3028 struct d_print_info *dpi;
3029 struct d_print_mod *mods;
3031 if (mods == NULL || mods->printed || d_print_saw_error (dpi))
3034 if (mods->mod->type == D_COMP_FUNCTION_TYPE)
3037 d_print_function_type (dpi, mods->mod, mods->next);
3040 else if (mods->mod->type == D_COMP_ARRAY_TYPE)
3043 d_print_array_type (dpi, mods->mod, mods->next);
3049 d_print_mod (dpi, mods->mod);
3051 d_print_mod_list (dpi, mods->next);
3054 /* Print a modifier. */
3057 d_print_mod (dpi, mod)
3058 struct d_print_info *dpi;
3059 const struct d_comp *mod;
3063 case D_COMP_RESTRICT:
3064 d_append_string (dpi, " restrict");
3066 case D_COMP_VOLATILE:
3067 d_append_string (dpi, " volatile");
3070 d_append_string (dpi, " const");
3072 case D_COMP_VENDOR_TYPE_QUAL:
3073 d_append_char (dpi, ' ');
3074 d_print_comp (dpi, d_right (mod));
3076 case D_COMP_POINTER:
3077 /* There is no pointer symbol in Java. */
3078 if ((dpi->options & DMGL_JAVA) == 0)
3079 d_append_char (dpi, '*');
3081 case D_COMP_REFERENCE:
3082 d_append_char (dpi, '&');
3084 case D_COMP_COMPLEX:
3085 d_append_string (dpi, "complex ");
3087 case D_COMP_IMAGINARY:
3088 d_append_string (dpi, "imaginary ");
3090 case D_COMP_PTRMEM_TYPE:
3091 if (dpi->buf[dpi->len - 1] != '(')
3092 d_append_char (dpi, ' ');
3093 d_print_comp (dpi, d_left (mod));
3094 d_append_string (dpi, "::*");
3096 case D_COMP_TYPED_NAME:
3097 d_print_comp (dpi, d_left (mod));
3100 /* Otherwise, we have something that won't go back on the
3101 modifier stack, so we can just print it. */
3102 d_print_comp (dpi, mod);
3107 /* Print a function type, except for the return type. */
3110 d_print_function_type (dpi, dc, mods)
3111 struct d_print_info *dpi;
3112 const struct d_comp *dc;
3113 struct d_print_mod *mods;
3119 struct d_print_mod *p;
3123 for (p = mods; p != NULL; p = p->next)
3129 switch (p->mod->type)
3131 case D_COMP_RESTRICT:
3132 case D_COMP_VOLATILE:
3134 case D_COMP_VENDOR_TYPE_QUAL:
3135 case D_COMP_POINTER:
3136 case D_COMP_REFERENCE:
3137 case D_COMP_COMPLEX:
3138 case D_COMP_IMAGINARY:
3139 case D_COMP_PTRMEM_TYPE:
3149 if (d_left (dc) != NULL && ! saw_mod)
3153 d_append_char (dpi, '(');
3155 d_print_mod_list (dpi, mods);
3158 d_append_char (dpi, ')');
3161 d_append_char (dpi, '(');
3163 if (d_right (dc) != NULL)
3164 d_print_comp (dpi, d_right (dc));
3166 d_append_char (dpi, ')');
3169 /* Print an array type, except for the element type. */
3172 d_print_array_type (dpi, dc, mods)
3173 struct d_print_info *dpi;
3174 const struct d_comp *dc;
3175 struct d_print_mod *mods;
3183 struct d_print_mod *p;
3186 for (p = mods; p != NULL; p = p->next)
3191 if (p->mod->type == D_COMP_ARRAY_TYPE)
3205 d_append_string (dpi, " (");
3207 d_print_mod_list (dpi, mods);
3210 d_append_char (dpi, ')');
3214 d_append_char (dpi, ' ');
3216 d_append_char (dpi, '[');
3218 if (d_left (dc) != NULL)
3219 d_print_comp (dpi, d_left (dc));
3221 d_append_char (dpi, ']');
3224 /* Print an operator in an expression. */
3227 d_print_expr_op (dpi, dc)
3228 struct d_print_info *dpi;
3229 const struct d_comp *dc;
3231 if (dc->type == D_COMP_OPERATOR)
3232 d_append_string (dpi, dc->u.s_operator.op->name);
3234 d_print_comp (dpi, dc);
3240 d_print_cast (dpi, dc)
3241 struct d_print_info *dpi;
3242 const struct d_comp *dc;
3244 if (d_left (dc)->type != D_COMP_TEMPLATE)
3245 d_print_comp (dpi, d_left (dc));
3248 struct d_print_template dpt;
3250 /* It appears that for a templated cast operator, we need to put
3251 the template parameters in scope for the operator name, but
3252 not for the parameters. The effect is that we need to handle
3253 the template printing here. FIXME: Verify this. */
3255 dpt.next = dpi->templates;
3256 dpi->templates = &dpt;
3257 dpt.template = d_left (dc);
3259 d_print_comp (dpi, d_left (d_left (dc)));
3261 dpi->templates = dpt.next;
3263 d_append_char (dpi, '<');
3264 d_print_comp (dpi, d_right (d_left (dc)));
3265 /* Avoid generating two consecutive '>' characters, to avoid
3266 the C++ syntactic ambiguity. */
3267 if (dpi->buf[dpi->len - 1] == '>')
3268 d_append_char (dpi, ' ');
3269 d_append_char (dpi, '>');
3273 /* Initialize the information structure we use to pass around
3277 d_init_info (mangled, options, len, di)
3278 const char *mangled;
3284 di->options = options;
3288 /* We can not need more components than twice the number of chars in
3289 the mangled string. Most components correspond directly to
3290 chars, but the ARGLIST types are exceptions. */
3291 di->num_comps = 2 * len;
3292 di->comps = (struct d_comp *) malloc (di->num_comps
3293 * sizeof (struct d_comp));
3296 /* Similarly, we can not need more substitutions than there are
3297 chars in the mangled string divided by 2, since it takes at least
3298 two chars to refer to a substitution. */
3299 di->num_subs = (len + 1) / 2;
3300 di->subs = (struct d_comp **) malloc (di->num_subs
3301 * sizeof (struct d_comp *));
3304 di->last_name = NULL;
3306 if (di->comps == NULL || di->subs == NULL)
3308 if (di->comps != NULL)
3310 if (di->subs != NULL)
3318 /* Entry point for the demangler. If MANGLED is a g++ v3 ABI mangled
3319 name, return a buffer allocated with malloc holding the demangled
3320 name. OPTIONS is the usual libiberty demangler options. On
3321 success, this sets *PALC to the allocated size of the returned
3322 buffer. On failure, this sets *PALC to 0 for a bad name, or 1 for
3323 a memory allocation failure. On failure, this returns NULL. */
3326 d_demangle (mangled, options, palc)
3327 const char* mangled;
3339 len = strlen (mangled);
3341 if (mangled[0] == '_' && mangled[1] == 'Z')
3343 else if (strncmp (mangled, "_GLOBAL_", 8) == 0
3344 && (mangled[8] == '.' || mangled[8] == '_' || mangled[8] == '$')
3345 && (mangled[9] == 'D' || mangled[9] == 'I')
3346 && mangled[10] == '_')
3350 r = malloc (40 + len - 11);
3355 if (mangled[9] == 'I')
3356 strcpy (r, "global constructors keyed to ");
3358 strcpy (r, "global destructors keyed to ");
3359 strcat (r, mangled + 11);
3365 if ((options & DMGL_TYPES) == 0)
3370 if (! d_init_info (mangled, options, len, &di))
3377 dc = d_mangled_name (&di);
3381 #ifdef CP_DEMANGLE_DEBUG
3383 printf ("failed demangling\n");
3393 ret = d_print (options, dc, palc);
3400 #if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3)
3402 extern char *__cxa_demangle PARAMS ((const char *, char *, size_t *, int *));
3404 /* ia64 ABI-mandated entry point in the C++ runtime library for
3405 performing demangling. MANGLED_NAME is a NUL-terminated character
3406 string containing the name to be demangled.
3408 OUTPUT_BUFFER is a region of memory, allocated with malloc, of
3409 *LENGTH bytes, into which the demangled name is stored. If
3410 OUTPUT_BUFFER is not long enough, it is expanded using realloc.
3411 OUTPUT_BUFFER may instead be NULL; in that case, the demangled name
3412 is placed in a region of memory allocated with malloc.
3414 If LENGTH is non-NULL, the length of the buffer conaining the
3415 demangled name, is placed in *LENGTH.
3417 The return value is a pointer to the start of the NUL-terminated
3418 demangled name, or NULL if the demangling fails. The caller is
3419 responsible for deallocating this memory using free.
3421 *STATUS is set to one of the following values:
3422 0: The demangling operation succeeded.
3423 -1: A memory allocation failure occurred.
3424 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
3425 -3: One of the arguments is invalid.
3427 The demangling is performed using the C++ ABI mangling rules, with
3431 __cxa_demangle (mangled_name, output_buffer, length, status)
3432 const char *mangled_name;
3433 char *output_buffer;
3443 if (mangled_name == NULL)
3449 if (output_buffer != NULL && length == NULL)
3455 demangled = d_demangle (mangled_name, DMGL_TYPES, &alc);
3457 if (demangled == NULL)
3466 if (output_buffer == NULL)
3473 if (strlen (demangled) < *length)
3475 strcpy (output_buffer, demangled);
3477 demangled = output_buffer;
3481 free (output_buffer);
3491 #else /* ! (IN_LIBGCC2 || IN_GLIBCPP_V3) */
3493 /* Entry point for libiberty demangler. If MANGLED is a g++ v3 ABI
3494 mangled name, return a buffer allocated with malloc holding the
3495 demangled name. Otherwise, return NULL. */
3498 cplus_demangle_v3 (mangled, options)
3499 const char* mangled;
3504 return d_demangle (mangled, options, &alc);
3507 /* Demangle a Java symbol. Java uses a subset of the V3 ABI C++ mangling
3508 conventions, but the output formatting is a little different.
3509 This instructs the C++ demangler not to emit pointer characters ("*"), and
3510 to use Java's namespace separator symbol ("." instead of "::"). It then
3511 does an additional pass over the demangled output to replace instances
3512 of JArray<TYPE> with TYPE[]. */
3515 java_demangle_v3 (mangled)
3516 const char* mangled;
3524 demangled = d_demangle (mangled, DMGL_JAVA, &alc);
3526 if (demangled == NULL)
3532 while (*from != '\0')
3534 if (strncmp (from, "JArray<", 7) == 0)
3539 else if (nesting > 0 && *from == '>')
3541 while (to > demangled && to[-1] == ' ')
3557 #endif /* IN_LIBGCC2 || IN_GLIBCPP_V3 */
3559 #ifndef IN_GLIBCPP_V3
3561 /* Demangle a string in order to find out whether it is a constructor
3562 or destructor. Return non-zero on success. Set *CTOR_KIND and
3563 *DTOR_KIND appropriately. */
3566 is_ctor_or_dtor (mangled, ctor_kind, dtor_kind)
3567 const char *mangled;
3568 enum gnu_v3_ctor_kinds *ctor_kind;
3569 enum gnu_v3_dtor_kinds *dtor_kind;
3574 *ctor_kind = (enum gnu_v3_ctor_kinds) 0;
3575 *dtor_kind = (enum gnu_v3_dtor_kinds) 0;
3577 if (! d_init_info (mangled, DMGL_GNU_V3, strlen (mangled), &di))
3580 dc = d_mangled_name (&di);
3591 case D_COMP_TYPED_NAME:
3592 case D_COMP_TEMPLATE:
3593 case D_COMP_RESTRICT:
3594 case D_COMP_VOLATILE:
3596 case D_COMP_VENDOR_TYPE_QUAL:
3599 case D_COMP_QUAL_NAME:
3603 *ctor_kind = dc->u.s_ctor.kind;
3606 *dtor_kind = dc->u.s_dtor.kind;
3614 /* Return whether NAME is the mangled form of a g++ V3 ABI constructor
3615 name. A non-zero return indicates the type of constructor. */
3617 enum gnu_v3_ctor_kinds
3618 is_gnu_v3_mangled_ctor (name)
3621 enum gnu_v3_ctor_kinds ctor_kind;
3622 enum gnu_v3_dtor_kinds dtor_kind;
3624 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
3625 return (enum gnu_v3_ctor_kinds) 0;
3630 /* Return whether NAME is the mangled form of a g++ V3 ABI destructor
3631 name. A non-zero return indicates the type of destructor. */
3633 enum gnu_v3_dtor_kinds
3634 is_gnu_v3_mangled_dtor (name)
3637 enum gnu_v3_ctor_kinds ctor_kind;
3638 enum gnu_v3_dtor_kinds dtor_kind;
3640 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
3641 return (enum gnu_v3_dtor_kinds) 0;
3645 #endif /* IN_GLIBCPP_V3 */
3647 #ifdef STANDALONE_DEMANGLER
3650 #include "dyn-string.h"
3652 static void print_usage PARAMS ((FILE* fp, int exit_value));
3654 #define IS_ALPHA(CHAR) \
3655 (((CHAR) >= 'a' && (CHAR) <= 'z') \
3656 || ((CHAR) >= 'A' && (CHAR) <= 'Z'))
3658 /* Non-zero if CHAR is a character than can occur in a mangled name. */
3659 #define is_mangled_char(CHAR) \
3660 (IS_ALPHA (CHAR) || IS_DIGIT (CHAR) \
3661 || (CHAR) == '_' || (CHAR) == '.' || (CHAR) == '$')
3663 /* The name of this program, as invoked. */
3664 const char* program_name;
3666 /* Prints usage summary to FP and then exits with EXIT_VALUE. */
3669 print_usage (fp, exit_value)
3673 fprintf (fp, "Usage: %s [options] [names ...]\n", program_name);
3674 fprintf (fp, "Options:\n");
3675 fprintf (fp, " -h,--help Display this message.\n");
3676 fprintf (fp, " -v,--verbose Produce verbose demanglings.\n");
3677 fprintf (fp, "If names are provided, they are demangled. Otherwise filters standard input.\n");
3682 /* Option specification for getopt_long. */
3683 static const struct option long_options[] =
3685 { "help", no_argument, NULL, 'h' },
3686 { "verbose", no_argument, NULL, 'v' },
3687 { NULL, no_argument, NULL, 0 },
3690 /* Main entry for a demangling filter executable. It will demangle
3691 its command line arguments, if any. If none are provided, it will
3692 filter stdin to stdout, replacing any recognized mangled C++ names
3693 with their demangled equivalents. */
3702 int options = DMGL_PARAMS | DMGL_ANSI | DMGL_TYPES;
3704 /* Use the program name of this program, as invoked. */
3705 program_name = argv[0];
3707 /* Parse options. */
3710 opt_char = getopt_long (argc, argv, "hv", long_options, NULL);
3713 case '?': /* Unrecognized option. */
3714 print_usage (stderr, 1);
3718 print_usage (stdout, 0);
3722 options |= DMGL_VERBOSE;
3726 while (opt_char != -1);
3729 /* No command line arguments were provided. Filter stdin. */
3731 dyn_string_t mangled = dyn_string_new (3);
3734 /* Read all of input. */
3735 while (!feof (stdin))
3739 /* Pile characters into mangled until we hit one that can't
3740 occur in a mangled name. */
3742 while (!feof (stdin) && is_mangled_char (c))
3744 dyn_string_append_char (mangled, c);
3750 if (dyn_string_length (mangled) > 0)
3752 s = cplus_demangle_v3 (dyn_string_buf (mangled), options);
3761 /* It might not have been a mangled name. Print the
3763 fputs (dyn_string_buf (mangled), stdout);
3766 dyn_string_clear (mangled);
3769 /* If we haven't hit EOF yet, we've read one character that
3770 can't occur in a mangled name, so print it out. */
3775 dyn_string_delete (mangled);
3778 /* Demangle command line arguments. */
3780 /* Loop over command line arguments. */
3781 for (i = optind; i < argc; ++i)
3785 /* Attempt to demangle. */
3786 s = cplus_demangle_v3 (argv[i], options);
3788 /* If it worked, print the demangled name. */
3795 fprintf (stderr, "Failed: %s\n", argv[i]);
3802 #endif /* STANDALONE_DEMANGLER */