OSDN Git Service

* splay-tree.c (splay_tree_delete_helper): Redesign the logic so
[pf3gnuchains/gcc-fork.git] / libiberty / cp-demangle.c
1 /* Demangler for g++ V3 ABI.
2    Copyright (C) 2003, 2004 Free Software Foundation, Inc.
3    Written by Ian Lance Taylor <ian@wasabisystems.com>.
4
5    This file is part of the libiberty library, which is part of GCC.
6
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.
11
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.)
20
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.
25
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. 
29 */
30
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
34
35    This code was written while looking at the demangler written by
36    Alex Samuel <samuel@codesourcery.com>.
37
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.
41
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)
47
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.
60
61    This file also defines some other functions and variables which are
62    only to be used by the file cp-demint.c.
63
64    Preprocessor macros you can define while compiling this file:
65
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().
71
72    IN_GLIBCPP_V3
73       If defined, this file defines only __cxa_demangle(), and no other
74       publically visible functions or variables.
75
76    STANDALONE_DEMANGLER
77       If defined, this file defines a main() function which demangles
78       any arguments, or, if none, demangles stdin.
79
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.
83 */
84
85 #ifdef HAVE_CONFIG_H
86 #include "config.h"
87 #endif
88
89 #include <stdio.h>
90
91 #ifdef HAVE_STDLIB_H
92 #include <stdlib.h>
93 #endif
94 #ifdef HAVE_STRING_H
95 #include <string.h>
96 #endif
97
98 #include "ansidecl.h"
99 #include "libiberty.h"
100 #include "demangle.h"
101 #include "cp-demangle.h"
102
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
108
109 #define CP_STATIC_IF_GLIBCPP_V3 static
110
111 #define cplus_demangle_fill_name d_fill_name
112 static int
113 d_fill_name PARAMS ((struct demangle_component *, const char *, int));
114
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 *));
119
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 *));
124
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 *));
129
130 #define cplus_demangle_mangled_name d_mangled_name
131 static struct demangle_component *
132 d_mangled_name PARAMS ((struct d_info *, int));
133
134 #define cplus_demangle_type d_type
135 static struct demangle_component *
136 d_type PARAMS ((struct d_info *));
137
138 #define cplus_demangle_print d_print
139 static char *
140 d_print PARAMS ((int, const struct demangle_component *, int, size_t *));
141
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 *));
145
146 #else /* ! defined(IN_GLIBCPP_V3) */
147 #define CP_STATIC_IF_GLIBCPP_V3
148 #endif /* ! defined(IN_GLIBCPP_V3) */
149
150 /* See if the compiler supports dynamic arrays.  */
151
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__) */
163
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.
168
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.  */
172
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')
176
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)
182
183 /* Information we keep for the standard substitutions.  */
184
185 struct d_standard_sub_info
186 {
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;
204 };
205
206 /* Accessors for subtrees of struct demangle_component.  */
207
208 #define d_left(dc) ((dc)->u.s_binary.left)
209 #define d_right(dc) ((dc)->u.s_binary.right)
210
211 /* A list of templates.  This is used while printing.  */
212
213 struct d_print_template
214 {
215   /* Next template on the list.  */
216   struct d_print_template *next;
217   /* This template.  */
218   const struct demangle_component *template;
219 };
220
221 /* A list of type modifiers.  This is used while printing.  */
222
223 struct d_print_mod
224 {
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;
234 };
235
236 /* We use this structure to hold information during printing.  */
237
238 struct d_print_info
239 {
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;
255 };
256
257 #define d_print_saw_error(dpi) ((dpi)->buf == NULL)
258
259 #define d_append_char(dpi, c) \
260   do \
261     { \
262       if ((dpi)->buf != NULL && (dpi)->len < (dpi)->alc) \
263         (dpi)->buf[(dpi)->len++] = (c); \
264       else \
265         d_print_append_char ((dpi), (c)); \
266     } \
267   while (0)
268
269 #define d_append_buffer(dpi, s, l) \
270   do \
271     { \
272       if ((dpi)->buf != NULL && (dpi)->len + (l) <= (dpi)->alc) \
273         { \
274           memcpy ((dpi)->buf + (dpi)->len, (s), (l)); \
275           (dpi)->len += l; \
276         } \
277       else \
278         d_print_append_buffer ((dpi), (s), (l)); \
279     } \
280   while (0)
281
282 #define d_append_string_constant(dpi, s) \
283   d_append_buffer (dpi, (s), sizeof (s) - 1)
284
285 #define d_last_char(dpi) \
286   ((dpi)->buf == NULL || (dpi)->len == 0 ? '\0' : (dpi)->buf[(dpi)->len - 1])
287
288 #ifdef CP_DEMANGLE_DEBUG
289 static void 
290 d_dump PARAMS ((struct demangle_component *, int));
291 #endif
292
293 static struct demangle_component *
294 d_make_empty PARAMS ((struct d_info *));
295
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 *));
300
301 static struct demangle_component *
302 d_make_name PARAMS ((struct d_info *, const char *, int));
303
304 static struct demangle_component *
305 d_make_builtin_type PARAMS ((struct d_info *,
306                              const struct demangle_builtin_type_info *));
307
308 static struct demangle_component *
309 d_make_operator PARAMS ((struct d_info *,
310                          const struct demangle_operator_info *));
311
312 static struct demangle_component *
313 d_make_extended_operator PARAMS ((struct d_info *, int,
314                                   struct demangle_component *));
315
316 static struct demangle_component *
317 d_make_ctor PARAMS ((struct d_info *, enum gnu_v3_ctor_kinds,
318                      struct demangle_component *));
319
320 static struct demangle_component *
321 d_make_dtor PARAMS ((struct d_info *, enum gnu_v3_dtor_kinds,
322                      struct demangle_component *));
323
324 static struct demangle_component *
325 d_make_template_param PARAMS ((struct d_info *, long));
326
327 static struct demangle_component *
328 d_make_sub PARAMS ((struct d_info *, const char *, int));
329
330 static int
331 has_return_type PARAMS ((struct demangle_component *));
332
333 static int
334 is_ctor_dtor_or_conversion PARAMS ((struct demangle_component *));
335
336 static struct demangle_component *
337 d_encoding PARAMS ((struct d_info *, int));
338
339 static struct demangle_component *
340 d_name PARAMS ((struct d_info *));
341
342 static struct demangle_component *
343 d_nested_name PARAMS ((struct d_info *));
344
345 static struct demangle_component *
346 d_prefix PARAMS ((struct d_info *));
347
348 static struct demangle_component *
349 d_unqualified_name PARAMS ((struct d_info *));
350
351 static struct demangle_component *
352 d_source_name PARAMS ((struct d_info *));
353
354 static long
355 d_number PARAMS ((struct d_info *));
356
357 static struct demangle_component *
358 d_identifier PARAMS ((struct d_info *, int));
359
360 static struct demangle_component *
361 d_operator_name PARAMS ((struct d_info *));
362
363 static struct demangle_component *
364 d_special_name PARAMS ((struct d_info *));
365
366 static int
367 d_call_offset PARAMS ((struct d_info *, int));
368
369 static struct demangle_component *
370 d_ctor_dtor_name PARAMS ((struct d_info *));
371
372 static struct demangle_component **
373 d_cv_qualifiers PARAMS ((struct d_info *, struct demangle_component **, int));
374
375 static struct demangle_component *
376 d_function_type PARAMS ((struct d_info *));
377
378 static struct demangle_component *
379 d_bare_function_type PARAMS ((struct d_info *, int));
380
381 static struct demangle_component *
382 d_class_enum_type PARAMS ((struct d_info *));
383
384 static struct demangle_component *
385 d_array_type PARAMS ((struct d_info *));
386
387 static struct demangle_component *
388 d_pointer_to_member_type PARAMS ((struct d_info *));
389
390 static struct demangle_component *
391 d_template_param PARAMS ((struct d_info *));
392
393 static struct demangle_component *
394 d_template_args PARAMS ((struct d_info *));
395
396 static struct demangle_component *
397 d_template_arg PARAMS ((struct d_info *));
398
399 static struct demangle_component *
400 d_expression PARAMS ((struct d_info *));
401
402 static struct demangle_component *
403 d_expr_primary PARAMS ((struct d_info *));
404
405 static struct demangle_component *
406 d_local_name PARAMS ((struct d_info *));
407
408 static int
409 d_discriminator PARAMS ((struct d_info *));
410
411 static int
412 d_add_substitution PARAMS ((struct d_info *, struct demangle_component *));
413
414 static struct demangle_component *
415 d_substitution PARAMS ((struct d_info *, int));
416
417 static void
418 d_print_resize PARAMS ((struct d_print_info *, size_t));
419
420 static void
421 d_print_append_char PARAMS ((struct d_print_info *, int));
422
423 static void
424 d_print_append_buffer PARAMS ((struct d_print_info *, const char *, size_t));
425
426 static void
427 d_print_error PARAMS ((struct d_print_info *));
428
429 static void
430 d_print_comp PARAMS ((struct d_print_info *,
431                       const struct demangle_component *));
432
433 static void
434 d_print_java_identifier PARAMS ((struct d_print_info *, const char *, int));
435
436 static void
437 d_print_mod_list PARAMS ((struct d_print_info *, struct d_print_mod *, int));
438
439 static void
440 d_print_mod PARAMS ((struct d_print_info *,
441                      const struct demangle_component *));
442
443 static void
444 d_print_function_type PARAMS ((struct d_print_info *,
445                                const struct demangle_component *,
446                                struct d_print_mod *));
447
448 static void
449 d_print_array_type PARAMS ((struct d_print_info *,
450                             const struct demangle_component *,
451                             struct d_print_mod *));
452
453 static void
454 d_print_expr_op PARAMS ((struct d_print_info *,
455                          const struct demangle_component *));
456
457 static void
458 d_print_cast PARAMS ((struct d_print_info *,
459                       const struct demangle_component *));
460
461 static char *
462 d_demangle PARAMS ((const char *, int, size_t *));
463
464 #ifdef CP_DEMANGLE_DEBUG
465
466 static void
467 d_dump (dc, indent)
468      struct demangle_component *dc;
469      int indent;
470 {
471   int i;
472
473   if (dc == NULL)
474     return;
475
476   for (i = 0; i < indent; ++i)
477     putchar (' ');
478
479   switch (dc->type)
480     {
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;
509
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;
636     }
637
638   d_dump (d_left (dc), indent + 2);
639   d_dump (d_right (dc), indent + 2);
640 }
641
642 #endif /* CP_DEMANGLE_DEBUG */
643
644 /* Fill in a DEMANGLE_COMPONENT_NAME.  */
645
646 CP_STATIC_IF_GLIBCPP_V3
647 int
648 cplus_demangle_fill_name (p, s, len)
649      struct demangle_component *p;
650      const char *s;
651      int len;
652 {
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;
659 }
660
661 /* Fill in a DEMANGLE_COMPONENT_EXTENDED_OPERATOR.  */
662
663 CP_STATIC_IF_GLIBCPP_V3
664 int
665 cplus_demangle_fill_extended_operator (p, args, name)
666      struct demangle_component *p;
667      int args;
668      struct demangle_component *name;
669 {
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;
676 }
677
678 /* Fill in a DEMANGLE_COMPONENT_CTOR.  */
679
680 CP_STATIC_IF_GLIBCPP_V3
681 int
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;
686 {
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;
696 }
697
698 /* Fill in a DEMANGLE_COMPONENT_DTOR.  */
699
700 CP_STATIC_IF_GLIBCPP_V3
701 int
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;
706 {
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;
716 }
717
718 /* Add a new component.  */
719
720 static struct demangle_component *
721 d_make_empty (di)
722      struct d_info *di;
723 {
724   struct demangle_component *p;
725
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;
731 }
732
733 /* Add a new generic component.  */
734
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;
741 {
742   struct demangle_component *p;
743
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)
748     {
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;
768
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;
792
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;
799
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;
810
811       /* Other types should not be seen here.  */
812     default:
813       return NULL;
814     }
815
816   p = d_make_empty (di);
817   if (p != NULL)
818     {
819       p->type = type;
820       p->u.s_binary.left = left;
821       p->u.s_binary.right = right;
822     }
823   return p;
824 }
825
826 /* Add a new name component.  */
827
828 static struct demangle_component *
829 d_make_name (di, s, len)
830      struct d_info *di;
831      const char *s;
832      int len;
833 {
834   struct demangle_component *p;
835
836   p = d_make_empty (di);
837   if (! cplus_demangle_fill_name (p, s, len))
838     return NULL;
839   return p;
840 }
841
842 /* Add a new builtin type component.  */
843
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;
848 {
849   struct demangle_component *p;
850
851   if (type == NULL)
852     return NULL;
853   p = d_make_empty (di);
854   if (p != NULL)
855     {
856       p->type = DEMANGLE_COMPONENT_BUILTIN_TYPE;
857       p->u.s_builtin.type = type;
858     }
859   return p;
860 }
861
862 /* Add a new operator component.  */
863
864 static struct demangle_component *
865 d_make_operator (di, op)
866      struct d_info *di;
867      const struct demangle_operator_info *op;
868 {
869   struct demangle_component *p;
870
871   p = d_make_empty (di);
872   if (p != NULL)
873     {
874       p->type = DEMANGLE_COMPONENT_OPERATOR;
875       p->u.s_operator.op = op;
876     }
877   return p;
878 }
879
880 /* Add a new extended operator component.  */
881
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;
887 {
888   struct demangle_component *p;
889
890   p = d_make_empty (di);
891   if (! cplus_demangle_fill_extended_operator (p, args, name))
892     return NULL;
893   return p;
894 }
895
896 /* Add a new constructor component.  */
897
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;
903 {
904   struct demangle_component *p;
905
906   p = d_make_empty (di);
907   if (! cplus_demangle_fill_ctor (p, kind, name))
908     return NULL;
909   return p;
910 }
911
912 /* Add a new destructor component.  */
913
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;
919 {
920   struct demangle_component *p;
921
922   p = d_make_empty (di);
923   if (! cplus_demangle_fill_dtor (p, kind, name))
924     return NULL;
925   return p;
926 }
927
928 /* Add a new template parameter.  */
929
930 static struct demangle_component *
931 d_make_template_param (di, i)
932      struct d_info *di;
933      long i;
934 {
935   struct demangle_component *p;
936
937   p = d_make_empty (di);
938   if (p != NULL)
939     {
940       p->type = DEMANGLE_COMPONENT_TEMPLATE_PARAM;
941       p->u.s_number.number = i;
942     }
943   return p;
944 }
945
946 /* Add a new standard substitution component.  */
947
948 static struct demangle_component *
949 d_make_sub (di, name, len)
950      struct d_info *di;
951      const char *name;
952      int len;
953 {
954   struct demangle_component *p;
955
956   p = d_make_empty (di);
957   if (p != NULL)
958     {
959       p->type = DEMANGLE_COMPONENT_SUB_STD;
960       p->u.s_string.string = name;
961       p->u.s_string.len = len;
962     }
963   return p;
964 }
965
966 /* <mangled-name> ::= _Z <encoding>
967
968    TOP_LEVEL is non-zero when called at the top level.  */
969
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;
975 {
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);
981 }
982
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.  */
991
992 static int
993 has_return_type (dc)
994      struct demangle_component *dc;
995 {
996   if (dc == NULL)
997     return 0;
998   switch (dc->type)
999     {
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));
1008     }
1009 }
1010
1011 /* Return whether a name is a constructor, a destructor, or a
1012    conversion operator.  */
1013
1014 static int
1015 is_ctor_dtor_or_conversion (dc)
1016      struct demangle_component *dc;
1017 {
1018   if (dc == NULL)
1019     return 0;
1020   switch (dc->type)
1021     {
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;
1031     }
1032 }
1033
1034 /* <encoding> ::= <(function) name> <bare-function-type>
1035               ::= <(data) name>
1036               ::= <special-name>
1037
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.  */
1042
1043 static struct demangle_component *
1044 d_encoding (di, top_level)
1045      struct d_info *di;
1046      int top_level;
1047 {
1048   char peek = d_peek_char (di);
1049
1050   if (peek == 'G' || peek == 'T')
1051     return d_special_name (di);
1052   else
1053     {
1054       struct demangle_component *dc;
1055
1056       dc = d_name (di);
1057
1058       if (dc != NULL && top_level && (di->options & DMGL_PARAMS) == 0)
1059         {
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);
1067
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)
1073             {
1074               struct demangle_component *dcr;
1075
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;
1082             }
1083
1084           return dc;
1085         }
1086
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)));
1092     }
1093 }
1094
1095 /* <name> ::= <nested-name>
1096           ::= <unscoped-name>
1097           ::= <unscoped-template-name> <template-args>
1098           ::= <local-name>
1099
1100    <unscoped-name> ::= <unqualified-name>
1101                    ::= St <unqualified-name>
1102
1103    <unscoped-template-name> ::= <unscoped-name>
1104                             ::= <substitution>
1105 */
1106
1107 static struct demangle_component *
1108 d_name (di)
1109      struct d_info *di;
1110 {
1111   char peek = d_peek_char (di);
1112   struct demangle_component *dc;
1113
1114   switch (peek)
1115     {
1116     case 'N':
1117       return d_nested_name (di);
1118
1119     case 'Z':
1120       return d_local_name (di);
1121
1122     case 'S':
1123       {
1124         int subst;
1125
1126         if (d_peek_next_char (di) != 't')
1127           {
1128             dc = d_substitution (di, 0);
1129             subst = 1;
1130           }
1131         else
1132           {
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;
1139           }
1140
1141         if (d_peek_char (di) != 'I')
1142           {
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.  */
1146           }
1147         else
1148           {
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)
1154               {
1155                 if (! d_add_substitution (di, dc))
1156                   return NULL;
1157               }
1158             dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc,
1159                               d_template_args (di));
1160           }
1161
1162         return dc;
1163       }
1164
1165     default:
1166       dc = d_unqualified_name (di);
1167       if (d_peek_char (di) == 'I')
1168         {
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));
1176         }
1177       return dc;
1178     }
1179 }
1180
1181 /* <nested-name> ::= N [<CV-qualifiers>] <prefix> <unqualified-name> E
1182                  ::= N [<CV-qualifiers>] <template-prefix> <template-args> E
1183 */
1184
1185 static struct demangle_component *
1186 d_nested_name (di)
1187      struct d_info *di;
1188 {
1189   struct demangle_component *ret;
1190   struct demangle_component **pret;
1191
1192   if (d_next_char (di) != 'N')
1193     return NULL;
1194
1195   pret = d_cv_qualifiers (di, &ret, 1);
1196   if (pret == NULL)
1197     return NULL;
1198
1199   *pret = d_prefix (di);
1200   if (*pret == NULL)
1201     return NULL;
1202
1203   if (d_next_char (di) != 'E')
1204     return NULL;
1205
1206   return ret;
1207 }
1208
1209 /* <prefix> ::= <prefix> <unqualified-name>
1210             ::= <template-prefix> <template-args>
1211             ::= <template-param>
1212             ::=
1213             ::= <substitution>
1214
1215    <template-prefix> ::= <prefix> <(template) unqualified-name>
1216                      ::= <template-param>
1217                      ::= <substitution>
1218 */
1219
1220 static struct demangle_component *
1221 d_prefix (di)
1222      struct d_info *di;
1223 {
1224   struct demangle_component *ret = NULL;
1225
1226   while (1)
1227     {
1228       char peek;
1229       enum demangle_component_type comb_type;
1230       struct demangle_component *dc;
1231
1232       peek = d_peek_char (di);
1233       if (peek == '\0')
1234         return NULL;
1235
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.  */
1239
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')
1249         {
1250           if (ret == NULL)
1251             return NULL;
1252           comb_type = DEMANGLE_COMPONENT_TEMPLATE;
1253           dc = d_template_args (di);
1254         }
1255       else if (peek == 'T')
1256         dc = d_template_param (di);
1257       else if (peek == 'E')
1258         return ret;
1259       else
1260         return NULL;
1261
1262       if (ret == NULL)
1263         ret = dc;
1264       else
1265         ret = d_make_comp (di, comb_type, ret, dc);
1266
1267       if (peek != 'S' && d_peek_char (di) != 'E')
1268         {
1269           if (! d_add_substitution (di, ret))
1270             return NULL;
1271         }
1272     }
1273 }
1274
1275 /* <unqualified-name> ::= <operator-name>
1276                       ::= <ctor-dtor-name>
1277                       ::= <source-name>
1278 */
1279
1280 static struct demangle_component *
1281 d_unqualified_name (di)
1282      struct d_info *di;
1283 {
1284   char peek;
1285
1286   peek = d_peek_char (di);
1287   if (IS_DIGIT (peek))
1288     return d_source_name (di);
1289   else if (IS_LOWER (peek))
1290     {
1291       struct demangle_component *ret;
1292
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;
1297     }
1298   else if (peek == 'C' || peek == 'D')
1299     return d_ctor_dtor_name (di);
1300   else
1301     return NULL;
1302 }
1303
1304 /* <source-name> ::= <(positive length) number> <identifier>  */
1305
1306 static struct demangle_component *
1307 d_source_name (di)
1308      struct d_info *di;
1309 {
1310   long len;
1311   struct demangle_component *ret;
1312
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;
1319 }
1320
1321 /* number ::= [n] <(non-negative decimal integer)>  */
1322
1323 static long
1324 d_number (di)
1325      struct d_info *di;
1326 {
1327   int negative;
1328   char peek;
1329   long ret;
1330
1331   negative = 0;
1332   peek = d_peek_char (di);
1333   if (peek == 'n')
1334     {
1335       negative = 1;
1336       d_advance (di, 1);
1337       peek = d_peek_char (di);
1338     }
1339
1340   ret = 0;
1341   while (1)
1342     {
1343       if (! IS_DIGIT (peek))
1344         {
1345           if (negative)
1346             ret = - ret;
1347           return ret;
1348         }
1349       ret = ret * 10 + peek - '0';
1350       d_advance (di, 1);
1351       peek = d_peek_char (di);
1352     }
1353 }
1354
1355 /* identifier ::= <(unqualified source code identifier)>  */
1356
1357 static struct demangle_component *
1358 d_identifier (di, len)
1359      struct d_info *di;
1360      int len;
1361 {
1362   const char *name;
1363
1364   name = d_str (di);
1365
1366   if (di->send - name < len)
1367     return NULL;
1368
1369   d_advance (di, len);
1370
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);
1377
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)
1384     {
1385       const char *s;
1386
1387       s = name + ANONYMOUS_NAMESPACE_PREFIX_LEN;
1388       if ((*s == '.' || *s == '_' || *s == '$')
1389           && s[1] == 'N')
1390         {
1391           di->expansion -= len - sizeof "(anonymous namespace)";
1392           return d_make_name (di, "(anonymous namespace)",
1393                               sizeof "(anonymous namespace)" - 1);
1394         }
1395     }
1396
1397   return d_make_name (di, name, len);
1398 }
1399
1400 /* operator_name ::= many different two character encodings.
1401                  ::= cv <type>
1402                  ::= v <digit> <source-name>
1403 */
1404
1405 #define NL(s) s, (sizeof s) - 1
1406
1407 CP_STATIC_IF_GLIBCPP_V3
1408 const struct demangle_operator_info cplus_demangle_operators[] =
1409 {
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 }
1460 };
1461
1462 static struct demangle_component *
1463 d_operator_name (di)
1464      struct d_info *di;
1465 {
1466   char c1;
1467   char c2;
1468
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
1477     {
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);
1485
1486       while (1)
1487         {
1488           int i;
1489           const struct demangle_operator_info *p;
1490
1491           i = low + (high - low) / 2;
1492           p = cplus_demangle_operators + i;
1493
1494           if (c1 == p->code[0] && c2 == p->code[1])
1495             return d_make_operator (di, p);
1496
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;
1503         }
1504     }
1505 }
1506
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>
1519 */
1520
1521 static struct demangle_component *
1522 d_special_name (di)
1523      struct d_info *di;
1524 {
1525   char c;
1526
1527   di->expansion += 20;
1528   c = d_next_char (di);
1529   if (c == 'T')
1530     {
1531       switch (d_next_char (di))
1532         {
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);
1547
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);
1553
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);
1559
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);
1567
1568         case 'C':
1569           {
1570             struct demangle_component *derived_type;
1571             long offset;
1572             struct demangle_component *base_type;
1573
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);
1586           }
1587
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);
1594
1595         default:
1596           return NULL;
1597         }
1598     }
1599   else if (c == 'G')
1600     {
1601       switch (d_next_char (di))
1602         {
1603         case 'V':
1604           return d_make_comp (di, DEMANGLE_COMPONENT_GUARD, d_name (di), NULL);
1605
1606         case 'R':
1607           return d_make_comp (di, DEMANGLE_COMPONENT_REFTEMP, d_name (di),
1608                               NULL);
1609
1610         default:
1611           return NULL;
1612         }
1613     }
1614   else
1615     return NULL;
1616 }
1617
1618 /* <call-offset> ::= h <nv-offset> _
1619                  ::= v <v-offset> _
1620
1621    <nv-offset> ::= <(offset) number>
1622
1623    <v-offset> ::= <(offset) number> _ <(virtual offset) number>
1624
1625    The C parameter, if not '\0', is a character we just read which is
1626    the start of the <call-offset>.
1627
1628    We don't display the offset information anywhere.  FIXME: We should
1629    display it in verbose mode.  */
1630
1631 static int
1632 d_call_offset (di, c)
1633      struct d_info *di;
1634      int c;
1635 {
1636   if (c == '\0')
1637     c = d_next_char (di);
1638
1639   if (c == 'h')
1640     d_number (di);
1641   else if (c == 'v')
1642     {
1643       d_number (di);
1644       if (d_next_char (di) != '_')
1645         return 0;
1646       d_number (di);
1647     }
1648   else
1649     return 0;
1650
1651   if (d_next_char (di) != '_')
1652     return 0;
1653
1654   return 1;
1655 }
1656
1657 /* <ctor-dtor-name> ::= C1
1658                     ::= C2
1659                     ::= C3
1660                     ::= D0
1661                     ::= D1
1662                     ::= D2
1663 */
1664
1665 static struct demangle_component *
1666 d_ctor_dtor_name (di)
1667      struct d_info *di;
1668 {
1669   if (di->last_name != NULL)
1670     {
1671       if (di->last_name->type == DEMANGLE_COMPONENT_NAME)
1672         di->expansion += di->last_name->u.s_name.len;
1673       else if (di->last_name->type == DEMANGLE_COMPONENT_SUB_STD)
1674         di->expansion += di->last_name->u.s_string.len;
1675     }
1676   switch (d_next_char (di))
1677     {
1678     case 'C':
1679       {
1680         enum gnu_v3_ctor_kinds kind;
1681
1682         switch (d_next_char (di))
1683           {
1684           case '1':
1685             kind = gnu_v3_complete_object_ctor;
1686             break;
1687           case '2':
1688             kind = gnu_v3_base_object_ctor;
1689             break;
1690           case '3':
1691             kind = gnu_v3_complete_object_allocating_ctor;
1692             break;
1693           default:
1694             return NULL;
1695           }
1696         return d_make_ctor (di, kind, di->last_name);
1697       }
1698
1699     case 'D':
1700       {
1701         enum gnu_v3_dtor_kinds kind;
1702
1703         switch (d_next_char (di))
1704           {
1705           case '0':
1706             kind = gnu_v3_deleting_dtor;
1707             break;
1708           case '1':
1709             kind = gnu_v3_complete_object_dtor;
1710             break;
1711           case '2':
1712             kind = gnu_v3_base_object_dtor;
1713             break;
1714           default:
1715             return NULL;
1716           }
1717         return d_make_dtor (di, kind, di->last_name);
1718       }
1719
1720     default:
1721       return NULL;
1722     }
1723 }
1724
1725 /* <type> ::= <builtin-type>
1726           ::= <function-type>
1727           ::= <class-enum-type>
1728           ::= <array-type>
1729           ::= <pointer-to-member-type>
1730           ::= <template-param>
1731           ::= <template-template-param> <template-args>
1732           ::= <substitution>
1733           ::= <CV-qualifiers> <type>
1734           ::= P <type>
1735           ::= R <type>
1736           ::= C <type>
1737           ::= G <type>
1738           ::= U <source-name> <type>
1739
1740    <builtin-type> ::= various one letter codes
1741                   ::= u <source-name>
1742 */
1743
1744 CP_STATIC_IF_GLIBCPP_V3
1745 const struct demangle_builtin_type_info
1746 cplus_demangle_builtin_types[D_BUILTIN_TYPE_COUNT] =
1747 {
1748   /* a */ { NL ("signed char"), NL ("signed char"),     D_PRINT_DEFAULT },
1749   /* b */ { NL ("bool"),        NL ("boolean"),         D_PRINT_BOOL },
1750   /* c */ { NL ("char"),        NL ("byte"),            D_PRINT_DEFAULT },
1751   /* d */ { NL ("double"),      NL ("double"),          D_PRINT_FLOAT },
1752   /* e */ { NL ("long double"), NL ("long double"),     D_PRINT_FLOAT },
1753   /* f */ { NL ("float"),       NL ("float"),           D_PRINT_FLOAT },
1754   /* g */ { NL ("__float128"),  NL ("__float128"),      D_PRINT_FLOAT },
1755   /* h */ { NL ("unsigned char"), NL ("unsigned char"), D_PRINT_DEFAULT },
1756   /* i */ { NL ("int"),         NL ("int"),             D_PRINT_INT },
1757   /* j */ { NL ("unsigned int"), NL ("unsigned"),       D_PRINT_UNSIGNED },
1758   /* k */ { NULL, 0,            NULL, 0,                D_PRINT_DEFAULT },
1759   /* l */ { NL ("long"),        NL ("long"),            D_PRINT_LONG },
1760   /* m */ { NL ("unsigned long"), NL ("unsigned long"), D_PRINT_UNSIGNED_LONG },
1761   /* n */ { NL ("__int128"),    NL ("__int128"),        D_PRINT_DEFAULT },
1762   /* o */ { NL ("unsigned __int128"), NL ("unsigned __int128"),
1763             D_PRINT_DEFAULT },
1764   /* p */ { NULL, 0,            NULL, 0,                D_PRINT_DEFAULT },
1765   /* q */ { NULL, 0,            NULL, 0,                D_PRINT_DEFAULT },
1766   /* r */ { NULL, 0,            NULL, 0,                D_PRINT_DEFAULT },
1767   /* s */ { NL ("short"),       NL ("short"),           D_PRINT_DEFAULT },
1768   /* t */ { NL ("unsigned short"), NL ("unsigned short"), D_PRINT_DEFAULT },
1769   /* u */ { NULL, 0,            NULL, 0,                D_PRINT_DEFAULT },
1770   /* v */ { NL ("void"),        NL ("void"),            D_PRINT_VOID },
1771   /* w */ { NL ("wchar_t"),     NL ("char"),            D_PRINT_DEFAULT },
1772   /* x */ { NL ("long long"),   NL ("long"),            D_PRINT_LONG_LONG },
1773   /* y */ { NL ("unsigned long long"), NL ("unsigned long long"),
1774             D_PRINT_UNSIGNED_LONG_LONG },
1775   /* z */ { NL ("..."),         NL ("..."),             D_PRINT_DEFAULT },
1776 };
1777
1778 CP_STATIC_IF_GLIBCPP_V3
1779 struct demangle_component *
1780 cplus_demangle_type (di)
1781      struct d_info *di;
1782 {
1783   char peek;
1784   struct demangle_component *ret;
1785   int can_subst;
1786
1787   /* The ABI specifies that when CV-qualifiers are used, the base type
1788      is substitutable, and the fully qualified type is substitutable,
1789      but the base type with a strict subset of the CV-qualifiers is
1790      not substitutable.  The natural recursive implementation of the
1791      CV-qualifiers would cause subsets to be substitutable, so instead
1792      we pull them all off now.
1793
1794      FIXME: The ABI says that order-insensitive vendor qualifiers
1795      should be handled in the same way, but we have no way to tell
1796      which vendor qualifiers are order-insensitive and which are
1797      order-sensitive.  So we just assume that they are all
1798      order-sensitive.  g++ 3.4 supports only one vendor qualifier,
1799      __vector, and it treats it as order-sensitive when mangling
1800      names.  */
1801
1802   peek = d_peek_char (di);
1803   if (peek == 'r' || peek == 'V' || peek == 'K')
1804     {
1805       struct demangle_component **pret;
1806
1807       pret = d_cv_qualifiers (di, &ret, 0);
1808       if (pret == NULL)
1809         return NULL;
1810       *pret = cplus_demangle_type (di);
1811       if (! d_add_substitution (di, ret))
1812         return NULL;
1813       return ret;
1814     }
1815
1816   can_subst = 1;
1817
1818   switch (peek)
1819     {
1820     case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
1821     case 'h': case 'i': case 'j':           case 'l': case 'm': case 'n':
1822     case 'o':                               case 's': case 't':
1823     case 'v': case 'w': case 'x': case 'y': case 'z':
1824       ret = d_make_builtin_type (di,
1825                                  &cplus_demangle_builtin_types[peek - 'a']);
1826       di->expansion += ret->u.s_builtin.type->len;
1827       can_subst = 0;
1828       d_advance (di, 1);
1829       break;
1830
1831     case 'u':
1832       d_advance (di, 1);
1833       ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE,
1834                          d_source_name (di), NULL);
1835       break;
1836
1837     case 'F':
1838       ret = d_function_type (di);
1839       break;
1840
1841     case '0': case '1': case '2': case '3': case '4':
1842     case '5': case '6': case '7': case '8': case '9':
1843     case 'N':
1844     case 'Z':
1845       ret = d_class_enum_type (di);
1846       break;
1847
1848     case 'A':
1849       ret = d_array_type (di);
1850       break;
1851
1852     case 'M':
1853       ret = d_pointer_to_member_type (di);
1854       break;
1855
1856     case 'T':
1857       ret = d_template_param (di);
1858       if (d_peek_char (di) == 'I')
1859         {
1860           /* This is <template-template-param> <template-args>.  The
1861              <template-template-param> part is a substitution
1862              candidate.  */
1863           if (! d_add_substitution (di, ret))
1864             return NULL;
1865           ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
1866                              d_template_args (di));
1867         }
1868       break;
1869
1870     case 'S':
1871       /* If this is a special substitution, then it is the start of
1872          <class-enum-type>.  */
1873       {
1874         char peek_next;
1875
1876         peek_next = d_peek_next_char (di);
1877         if (IS_DIGIT (peek_next)
1878             || peek_next == '_'
1879             || IS_UPPER (peek_next))
1880           {
1881             ret = d_substitution (di, 0);
1882             /* The substituted name may have been a template name and
1883                may be followed by tepmlate args.  */
1884             if (d_peek_char (di) == 'I')
1885               ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
1886                                  d_template_args (di));
1887             else
1888               can_subst = 0;
1889           }
1890         else
1891           {
1892             ret = d_class_enum_type (di);
1893             /* If the substitution was a complete type, then it is not
1894                a new substitution candidate.  However, if the
1895                substitution was followed by template arguments, then
1896                the whole thing is a substitution candidate.  */
1897             if (ret != NULL && ret->type == DEMANGLE_COMPONENT_SUB_STD)
1898               can_subst = 0;
1899           }
1900       }
1901       break;
1902
1903     case 'P':
1904       d_advance (di, 1);
1905       ret = d_make_comp (di, DEMANGLE_COMPONENT_POINTER,
1906                          cplus_demangle_type (di), NULL);
1907       break;
1908
1909     case 'R':
1910       d_advance (di, 1);
1911       ret = d_make_comp (di, DEMANGLE_COMPONENT_REFERENCE,
1912                          cplus_demangle_type (di), NULL);
1913       break;
1914
1915     case 'C':
1916       d_advance (di, 1);
1917       ret = d_make_comp (di, DEMANGLE_COMPONENT_COMPLEX,
1918                          cplus_demangle_type (di), NULL);
1919       break;
1920
1921     case 'G':
1922       d_advance (di, 1);
1923       ret = d_make_comp (di, DEMANGLE_COMPONENT_IMAGINARY,
1924                          cplus_demangle_type (di), NULL);
1925       break;
1926
1927     case 'U':
1928       d_advance (di, 1);
1929       ret = d_source_name (di);
1930       ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL,
1931                          cplus_demangle_type (di), ret);
1932       break;
1933
1934     default:
1935       return NULL;
1936     }
1937
1938   if (can_subst)
1939     {
1940       if (! d_add_substitution (di, ret))
1941         return NULL;
1942     }
1943
1944   return ret;
1945 }
1946
1947 /* <CV-qualifiers> ::= [r] [V] [K]  */
1948
1949 static struct demangle_component **
1950 d_cv_qualifiers (di, pret, member_fn)
1951      struct d_info *di;
1952      struct demangle_component **pret;
1953      int member_fn;
1954 {
1955   char peek;
1956
1957   peek = d_peek_char (di);
1958   while (peek == 'r' || peek == 'V' || peek == 'K')
1959     {
1960       enum demangle_component_type t;
1961
1962       d_advance (di, 1);
1963       if (peek == 'r')
1964         {
1965           t = (member_fn
1966                ? DEMANGLE_COMPONENT_RESTRICT_THIS
1967                : DEMANGLE_COMPONENT_RESTRICT);
1968           di->expansion += sizeof "restrict";
1969         }
1970       else if (peek == 'V')
1971         {
1972           t = (member_fn
1973                ? DEMANGLE_COMPONENT_VOLATILE_THIS
1974                : DEMANGLE_COMPONENT_VOLATILE);
1975           di->expansion += sizeof "volatile";
1976         }
1977       else
1978         {
1979           t = (member_fn
1980                ? DEMANGLE_COMPONENT_CONST_THIS
1981                : DEMANGLE_COMPONENT_CONST);
1982           di->expansion += sizeof "const";
1983         }
1984
1985       *pret = d_make_comp (di, t, NULL, NULL);
1986       if (*pret == NULL)
1987         return NULL;
1988       pret = &d_left (*pret);
1989
1990       peek = d_peek_char (di);
1991     }
1992
1993   return pret;
1994 }
1995
1996 /* <function-type> ::= F [Y] <bare-function-type> E  */
1997
1998 static struct demangle_component *
1999 d_function_type (di)
2000      struct d_info *di;
2001 {
2002   struct demangle_component *ret;
2003
2004   if (d_next_char (di) != 'F')
2005     return NULL;
2006   if (d_peek_char (di) == 'Y')
2007     {
2008       /* Function has C linkage.  We don't print this information.
2009          FIXME: We should print it in verbose mode.  */
2010       d_advance (di, 1);
2011     }
2012   ret = d_bare_function_type (di, 1);
2013   if (d_next_char (di) != 'E')
2014     return NULL;
2015   return ret;
2016 }
2017
2018 /* <bare-function-type> ::= <type>+  */
2019
2020 static struct demangle_component *
2021 d_bare_function_type (di, has_return_type)
2022      struct d_info *di;
2023      int has_return_type;
2024 {
2025   struct demangle_component *return_type;
2026   struct demangle_component *tl;
2027   struct demangle_component **ptl;
2028
2029   return_type = NULL;
2030   tl = NULL;
2031   ptl = &tl;
2032   while (1)
2033     {
2034       char peek;
2035       struct demangle_component *type;
2036
2037       peek = d_peek_char (di);
2038       if (peek == '\0' || peek == 'E')
2039         break;
2040       type = cplus_demangle_type (di);
2041       if (type == NULL)
2042         return NULL;
2043       if (has_return_type)
2044         {
2045           return_type = type;
2046           has_return_type = 0;
2047         }
2048       else
2049         {
2050           *ptl = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, type, NULL);
2051           if (*ptl == NULL)
2052             return NULL;
2053           ptl = &d_right (*ptl);
2054         }
2055     }
2056
2057   /* There should be at least one parameter type besides the optional
2058      return type.  A function which takes no arguments will have a
2059      single parameter type void.  */
2060   if (tl == NULL)
2061     return NULL;
2062
2063   /* If we have a single parameter type void, omit it.  */
2064   if (d_right (tl) == NULL
2065       && d_left (tl)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
2066       && d_left (tl)->u.s_builtin.type->print == D_PRINT_VOID)
2067     {
2068       di->expansion -= d_left (tl)->u.s_builtin.type->len;
2069       tl = NULL;
2070     }
2071
2072   return d_make_comp (di, DEMANGLE_COMPONENT_FUNCTION_TYPE, return_type, tl);
2073 }
2074
2075 /* <class-enum-type> ::= <name>  */
2076
2077 static struct demangle_component *
2078 d_class_enum_type (di)
2079      struct d_info *di;
2080 {
2081   return d_name (di);
2082 }
2083
2084 /* <array-type> ::= A <(positive dimension) number> _ <(element) type>
2085                 ::= A [<(dimension) expression>] _ <(element) type>
2086 */
2087
2088 static struct demangle_component *
2089 d_array_type (di)
2090      struct d_info *di;
2091 {
2092   char peek;
2093   struct demangle_component *dim;
2094
2095   if (d_next_char (di) != 'A')
2096     return NULL;
2097
2098   peek = d_peek_char (di);
2099   if (peek == '_')
2100     dim = NULL;
2101   else if (IS_DIGIT (peek))
2102     {
2103       const char *s;
2104
2105       s = d_str (di);
2106       do
2107         {
2108           d_advance (di, 1);
2109           peek = d_peek_char (di);
2110         }
2111       while (IS_DIGIT (peek));
2112       dim = d_make_name (di, s, d_str (di) - s);
2113       if (dim == NULL)
2114         return NULL;
2115     }
2116   else
2117     {
2118       dim = d_expression (di);
2119       if (dim == NULL)
2120         return NULL;
2121     }
2122
2123   if (d_next_char (di) != '_')
2124     return NULL;
2125
2126   return d_make_comp (di, DEMANGLE_COMPONENT_ARRAY_TYPE, dim,
2127                       cplus_demangle_type (di));
2128 }
2129
2130 /* <pointer-to-member-type> ::= M <(class) type> <(member) type>  */
2131
2132 static struct demangle_component *
2133 d_pointer_to_member_type (di)
2134      struct d_info *di;
2135 {
2136   struct demangle_component *cl;
2137   struct demangle_component *mem;
2138   struct demangle_component **pmem;
2139
2140   if (d_next_char (di) != 'M')
2141     return NULL;
2142
2143   cl = cplus_demangle_type (di);
2144
2145   /* The ABI specifies that any type can be a substitution source, and
2146      that M is followed by two types, and that when a CV-qualified
2147      type is seen both the base type and the CV-qualified types are
2148      substitution sources.  The ABI also specifies that for a pointer
2149      to a CV-qualified member function, the qualifiers are attached to
2150      the second type.  Given the grammar, a plain reading of the ABI
2151      suggests that both the CV-qualified member function and the
2152      non-qualified member function are substitution sources.  However,
2153      g++ does not work that way.  g++ treats only the CV-qualified
2154      member function as a substitution source.  FIXME.  So to work
2155      with g++, we need to pull off the CV-qualifiers here, in order to
2156      avoid calling add_substitution() in cplus_demangle_type().  */
2157
2158   pmem = d_cv_qualifiers (di, &mem, 1);
2159   if (pmem == NULL)
2160     return NULL;
2161   *pmem = cplus_demangle_type (di);
2162
2163   return d_make_comp (di, DEMANGLE_COMPONENT_PTRMEM_TYPE, cl, mem);
2164 }
2165
2166 /* <template-param> ::= T_
2167                     ::= T <(parameter-2 non-negative) number> _
2168 */
2169
2170 static struct demangle_component *
2171 d_template_param (di)
2172      struct d_info *di;
2173 {
2174   long param;
2175
2176   if (d_next_char (di) != 'T')
2177     return NULL;
2178
2179   if (d_peek_char (di) == '_')
2180     param = 0;
2181   else
2182     {
2183       param = d_number (di);
2184       if (param < 0)
2185         return NULL;
2186       param += 1;
2187     }
2188
2189   if (d_next_char (di) != '_')
2190     return NULL;
2191
2192   ++di->did_subs;
2193
2194   return d_make_template_param (di, param);
2195 }
2196
2197 /* <template-args> ::= I <template-arg>+ E  */
2198
2199 static struct demangle_component *
2200 d_template_args (di)
2201      struct d_info *di;
2202 {
2203   struct demangle_component *hold_last_name;
2204   struct demangle_component *al;
2205   struct demangle_component **pal;
2206
2207   /* Preserve the last name we saw--don't let the template arguments
2208      clobber it, as that would give us the wrong name for a subsequent
2209      constructor or destructor.  */
2210   hold_last_name = di->last_name;
2211
2212   if (d_next_char (di) != 'I')
2213     return NULL;
2214
2215   al = NULL;
2216   pal = &al;
2217   while (1)
2218     {
2219       struct demangle_component *a;
2220
2221       a = d_template_arg (di);
2222       if (a == NULL)
2223         return NULL;
2224
2225       *pal = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, a, NULL);
2226       if (*pal == NULL)
2227         return NULL;
2228       pal = &d_right (*pal);
2229
2230       if (d_peek_char (di) == 'E')
2231         {
2232           d_advance (di, 1);
2233           break;
2234         }
2235     }
2236
2237   di->last_name = hold_last_name;
2238
2239   return al;
2240 }
2241
2242 /* <template-arg> ::= <type>
2243                   ::= X <expression> E
2244                   ::= <expr-primary>
2245 */
2246
2247 static struct demangle_component *
2248 d_template_arg (di)
2249      struct d_info *di;
2250 {
2251   struct demangle_component *ret;
2252
2253   switch (d_peek_char (di))
2254     {
2255     case 'X':
2256       d_advance (di, 1);
2257       ret = d_expression (di);
2258       if (d_next_char (di) != 'E')
2259         return NULL;
2260       return ret;
2261
2262     case 'L':
2263       return d_expr_primary (di);
2264
2265     default:
2266       return cplus_demangle_type (di);
2267     }
2268 }
2269
2270 /* <expression> ::= <(unary) operator-name> <expression>
2271                 ::= <(binary) operator-name> <expression> <expression>
2272                 ::= <(trinary) operator-name> <expression> <expression> <expression>
2273                 ::= st <type>
2274                 ::= <template-param>
2275                 ::= sr <type> <unqualified-name>
2276                 ::= sr <type> <unqualified-name> <template-args>
2277                 ::= <expr-primary>
2278 */
2279
2280 static struct demangle_component *
2281 d_expression (di)
2282      struct d_info *di;
2283 {
2284   char peek;
2285
2286   peek = d_peek_char (di);
2287   if (peek == 'L')
2288     return d_expr_primary (di);
2289   else if (peek == 'T')
2290     return d_template_param (di);
2291   else if (peek == 's' && d_peek_next_char (di) == 'r')
2292     {
2293       struct demangle_component *type;
2294       struct demangle_component *name;
2295
2296       d_advance (di, 2);
2297       type = cplus_demangle_type (di);
2298       name = d_unqualified_name (di);
2299       if (d_peek_char (di) != 'I')
2300         return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type, name);
2301       else
2302         return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type,
2303                             d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
2304                                          d_template_args (di)));
2305     }
2306   else
2307     {
2308       struct demangle_component *op;
2309       int args;
2310
2311       op = d_operator_name (di);
2312       if (op == NULL)
2313         return NULL;
2314
2315       if (op->type == DEMANGLE_COMPONENT_OPERATOR)
2316         di->expansion += op->u.s_operator.op->len - 2;
2317
2318       if (op->type == DEMANGLE_COMPONENT_OPERATOR
2319           && strcmp (op->u.s_operator.op->code, "st") == 0)
2320         return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
2321                             cplus_demangle_type (di));
2322
2323       switch (op->type)
2324         {
2325         default:
2326           return NULL;
2327         case DEMANGLE_COMPONENT_OPERATOR:
2328           args = op->u.s_operator.op->args;
2329           break;
2330         case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
2331           args = op->u.s_extended_operator.args;
2332           break;
2333         case DEMANGLE_COMPONENT_CAST:
2334           args = 1;
2335           break;
2336         }
2337
2338       switch (args)
2339         {
2340         case 1:
2341           return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
2342                               d_expression (di));
2343         case 2:
2344           {
2345             struct demangle_component *left;
2346
2347             left = d_expression (di);
2348             return d_make_comp (di, DEMANGLE_COMPONENT_BINARY, op,
2349                                 d_make_comp (di,
2350                                              DEMANGLE_COMPONENT_BINARY_ARGS,
2351                                              left,
2352                                              d_expression (di)));
2353           }
2354         case 3:
2355           {
2356             struct demangle_component *first;
2357             struct demangle_component *second;
2358
2359             first = d_expression (di);
2360             second = d_expression (di);
2361             return d_make_comp (di, DEMANGLE_COMPONENT_TRINARY, op,
2362                                 d_make_comp (di,
2363                                              DEMANGLE_COMPONENT_TRINARY_ARG1,
2364                                              first,
2365                                              d_make_comp (di,
2366                                                           DEMANGLE_COMPONENT_TRINARY_ARG2,
2367                                                           second,
2368                                                           d_expression (di))));
2369           }
2370         default:
2371           return NULL;
2372         }
2373     }
2374 }
2375
2376 /* <expr-primary> ::= L <type> <(value) number> E
2377                   ::= L <type> <(value) float> E
2378                   ::= L <mangled-name> E
2379 */
2380
2381 static struct demangle_component *
2382 d_expr_primary (di)
2383      struct d_info *di;
2384 {
2385   struct demangle_component *ret;
2386
2387   if (d_next_char (di) != 'L')
2388     return NULL;
2389   if (d_peek_char (di) == '_')
2390     ret = cplus_demangle_mangled_name (di, 0);
2391   else
2392     {
2393       struct demangle_component *type;
2394       enum demangle_component_type t;
2395       const char *s;
2396
2397       type = cplus_demangle_type (di);
2398       if (type == NULL)
2399         return NULL;
2400
2401       /* If we have a type we know how to print, we aren't going to
2402          print the type name itself.  */
2403       if (type->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
2404           && type->u.s_builtin.type->print != D_PRINT_DEFAULT)
2405         di->expansion -= type->u.s_builtin.type->len;
2406
2407       /* Rather than try to interpret the literal value, we just
2408          collect it as a string.  Note that it's possible to have a
2409          floating point literal here.  The ABI specifies that the
2410          format of such literals is machine independent.  That's fine,
2411          but what's not fine is that versions of g++ up to 3.2 with
2412          -fabi-version=1 used upper case letters in the hex constant,
2413          and dumped out gcc's internal representation.  That makes it
2414          hard to tell where the constant ends, and hard to dump the
2415          constant in any readable form anyhow.  We don't attempt to
2416          handle these cases.  */
2417
2418       t = DEMANGLE_COMPONENT_LITERAL;
2419       if (d_peek_char (di) == 'n')
2420         {
2421           t = DEMANGLE_COMPONENT_LITERAL_NEG;
2422           d_advance (di, 1);
2423         }
2424       s = d_str (di);
2425       while (d_peek_char (di) != 'E')
2426         d_advance (di, 1);
2427       ret = d_make_comp (di, t, type, d_make_name (di, s, d_str (di) - s));
2428     }
2429   if (d_next_char (di) != 'E')
2430     return NULL;
2431   return ret;
2432 }
2433
2434 /* <local-name> ::= Z <(function) encoding> E <(entity) name> [<discriminator>]
2435                 ::= Z <(function) encoding> E s [<discriminator>]
2436 */
2437
2438 static struct demangle_component *
2439 d_local_name (di)
2440      struct d_info *di;
2441 {
2442   struct demangle_component *function;
2443
2444   if (d_next_char (di) != 'Z')
2445     return NULL;
2446
2447   function = d_encoding (di, 0);
2448
2449   if (d_next_char (di) != 'E')
2450     return NULL;
2451
2452   if (d_peek_char (di) == 's')
2453     {
2454       d_advance (di, 1);
2455       if (! d_discriminator (di))
2456         return NULL;
2457       return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function,
2458                           d_make_name (di, "string literal",
2459                                        sizeof "string literal" - 1));
2460     }
2461   else
2462     {
2463       struct demangle_component *name;
2464
2465       name = d_name (di);
2466       if (! d_discriminator (di))
2467         return NULL;
2468       return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function, name);
2469     }
2470 }
2471
2472 /* <discriminator> ::= _ <(non-negative) number>
2473
2474    We demangle the discriminator, but we don't print it out.  FIXME:
2475    We should print it out in verbose mode.  */
2476
2477 static int
2478 d_discriminator (di)
2479      struct d_info *di;
2480 {
2481   long discrim;
2482
2483   if (d_peek_char (di) != '_')
2484     return 1;
2485   d_advance (di, 1);
2486   discrim = d_number (di);
2487   if (discrim < 0)
2488     return 0;
2489   return 1;
2490 }
2491
2492 /* Add a new substitution.  */
2493
2494 static int
2495 d_add_substitution (di, dc)
2496      struct d_info *di;
2497      struct demangle_component *dc;
2498 {
2499   if (dc == NULL)
2500     return 0;
2501   if (di->next_sub >= di->num_subs)
2502     return 0;
2503   di->subs[di->next_sub] = dc;
2504   ++di->next_sub;
2505   return 1;
2506 }
2507
2508 /* <substitution> ::= S <seq-id> _
2509                   ::= S_
2510                   ::= St
2511                   ::= Sa
2512                   ::= Sb
2513                   ::= Ss
2514                   ::= Si
2515                   ::= So
2516                   ::= Sd
2517
2518    If PREFIX is non-zero, then this type is being used as a prefix in
2519    a qualified name.  In this case, for the standard substitutions, we
2520    need to check whether we are being used as a prefix for a
2521    constructor or destructor, and return a full template name.
2522    Otherwise we will get something like std::iostream::~iostream()
2523    which does not correspond particularly well to any function which
2524    actually appears in the source.
2525 */
2526
2527 static const struct d_standard_sub_info standard_subs[] =
2528 {
2529   { 't', NL ("std"),
2530     NL ("std"),
2531     NULL, 0 },
2532   { 'a', NL ("std::allocator"),
2533     NL ("std::allocator"),
2534     NL ("allocator") },
2535   { 'b', NL ("std::basic_string"),
2536     NL ("std::basic_string"),
2537     NL ("basic_string") },
2538   { 's', NL ("std::string"),
2539     NL ("std::basic_string<char, std::char_traits<char>, std::allocator<char> >"),
2540     NL ("basic_string") },
2541   { 'i', NL ("std::istream"),
2542     NL ("std::basic_istream<char, std::char_traits<char> >"),
2543     NL ("basic_istream") },
2544   { 'o', NL ("std::ostream"),
2545     NL ("std::basic_ostream<char, std::char_traits<char> >"),
2546     NL ("basic_ostream") },
2547   { 'd', NL ("std::iostream"),
2548     NL ("std::basic_iostream<char, std::char_traits<char> >"),
2549     NL ("basic_iostream") }
2550 };
2551
2552 static struct demangle_component *
2553 d_substitution (di, prefix)
2554      struct d_info *di;
2555      int prefix;
2556 {
2557   char c;
2558
2559   if (d_next_char (di) != 'S')
2560     return NULL;
2561
2562   c = d_next_char (di);
2563   if (c == '_' || IS_DIGIT (c) || IS_UPPER (c))
2564     {
2565       int id;
2566
2567       id = 0;
2568       if (c != '_')
2569         {
2570           do
2571             {
2572               if (IS_DIGIT (c))
2573                 id = id * 36 + c - '0';
2574               else if (IS_UPPER (c))
2575                 id = id * 36 + c - 'A' + 10;
2576               else
2577                 return NULL;
2578               c = d_next_char (di);
2579             }
2580           while (c != '_');
2581
2582           ++id;
2583         }
2584
2585       if (id >= di->next_sub)
2586         return NULL;
2587
2588       ++di->did_subs;
2589
2590       return di->subs[id];
2591     }
2592   else
2593     {
2594       int verbose;
2595       const struct d_standard_sub_info *p;
2596       const struct d_standard_sub_info *pend;
2597
2598       verbose = (di->options & DMGL_VERBOSE) != 0;
2599       if (! verbose && prefix)
2600         {
2601           char peek;
2602
2603           peek = d_peek_char (di);
2604           if (peek == 'C' || peek == 'D')
2605             verbose = 1;
2606         }
2607
2608       pend = (&standard_subs[0]
2609               + sizeof standard_subs / sizeof standard_subs[0]);
2610       for (p = &standard_subs[0]; p < pend; ++p)
2611         {
2612           if (c == p->code)
2613             {
2614               const char *s;
2615               int len;
2616
2617               if (p->set_last_name != NULL)
2618                 di->last_name = d_make_sub (di, p->set_last_name,
2619                                             p->set_last_name_len);
2620               if (verbose)
2621                 {
2622                   s = p->full_expansion;
2623                   len = p->full_len;
2624                 }
2625               else
2626                 {
2627                   s = p->simple_expansion;
2628                   len = p->simple_len;
2629                 }
2630               di->expansion += len;
2631               return d_make_sub (di, s, len);
2632             }
2633         }
2634
2635       return NULL;
2636     }
2637 }
2638
2639 /* Resize the print buffer.  */
2640
2641 static void
2642 d_print_resize (dpi, add)
2643      struct d_print_info *dpi;
2644      size_t add;
2645 {
2646   size_t need;
2647
2648   if (dpi->buf == NULL)
2649     return;
2650   need = dpi->len + add;
2651   while (need > dpi->alc)
2652     {
2653       size_t newalc;
2654       char *newbuf;
2655
2656       newalc = dpi->alc * 2;
2657       newbuf = realloc (dpi->buf, newalc);
2658       if (newbuf == NULL)
2659         {
2660           free (dpi->buf);
2661           dpi->buf = NULL;
2662           dpi->allocation_failure = 1;
2663           return;
2664         }
2665       dpi->buf = newbuf;
2666       dpi->alc = newalc;
2667     }
2668 }
2669
2670 /* Append a character to the print buffer.  */
2671
2672 static void
2673 d_print_append_char (dpi, c)
2674      struct d_print_info *dpi;
2675      int c;
2676 {
2677   if (dpi->buf != NULL)
2678     {
2679       if (dpi->len >= dpi->alc)
2680         {
2681           d_print_resize (dpi, 1);
2682           if (dpi->buf == NULL)
2683             return;
2684         }
2685
2686       dpi->buf[dpi->len] = c;
2687       ++dpi->len;
2688     }
2689 }
2690
2691 /* Append a buffer to the print buffer.  */
2692
2693 static void
2694 d_print_append_buffer (dpi, s, l)
2695      struct d_print_info *dpi;
2696      const char *s;
2697      size_t l;
2698 {
2699   if (dpi->buf != NULL)
2700     {
2701       if (dpi->len + l > dpi->alc)
2702         {
2703           d_print_resize (dpi, l);
2704           if (dpi->buf == NULL)
2705             return;
2706         }
2707
2708       memcpy (dpi->buf + dpi->len, s, l);
2709       dpi->len += l;
2710     }
2711 }
2712
2713 /* Indicate that an error occurred during printing.  */
2714
2715 static void
2716 d_print_error (dpi)
2717      struct d_print_info *dpi;
2718 {
2719   free (dpi->buf);
2720   dpi->buf = NULL;
2721 }
2722
2723 /* Turn components into a human readable string.  OPTIONS is the
2724    options bits passed to the demangler.  DC is the tree to print.
2725    ESTIMATE is a guess at the length of the result.  This returns a
2726    string allocated by malloc, or NULL on error.  On success, this
2727    sets *PALC to the size of the allocated buffer.  On failure, this
2728    sets *PALC to 0 for a bad parse, or to 1 for a memory allocation
2729    failure.  */
2730
2731 CP_STATIC_IF_GLIBCPP_V3
2732 char *
2733 cplus_demangle_print (options, dc, estimate, palc)
2734      int options;
2735      const struct demangle_component *dc;
2736      int estimate;
2737      size_t *palc;
2738 {
2739   struct d_print_info dpi;
2740
2741   dpi.options = options;
2742
2743   dpi.alc = estimate + 1;
2744   dpi.buf = malloc (dpi.alc);
2745   if (dpi.buf == NULL)
2746     {
2747       *palc = 1;
2748       return NULL;
2749     }
2750
2751   dpi.len = 0;
2752   dpi.templates = NULL;
2753   dpi.modifiers = NULL;
2754
2755   dpi.allocation_failure = 0;
2756
2757   d_print_comp (&dpi, dc);
2758
2759   d_append_char (&dpi, '\0');
2760
2761   if (dpi.buf != NULL)
2762     *palc = dpi.alc;
2763   else
2764     *palc = dpi.allocation_failure;
2765
2766   return dpi.buf;
2767 }
2768
2769 /* Subroutine to handle components.  */
2770
2771 static void
2772 d_print_comp (dpi, dc)
2773      struct d_print_info *dpi;
2774      const struct demangle_component *dc;
2775 {
2776   if (dc == NULL)
2777     {
2778       d_print_error (dpi);
2779       return;
2780     }
2781   if (d_print_saw_error (dpi))
2782     return;
2783
2784   switch (dc->type)
2785     {
2786     case DEMANGLE_COMPONENT_NAME:
2787       if ((dpi->options & DMGL_JAVA) == 0)
2788         d_append_buffer (dpi, dc->u.s_name.s, dc->u.s_name.len);
2789       else
2790         d_print_java_identifier (dpi, dc->u.s_name.s, dc->u.s_name.len);
2791       return;
2792
2793     case DEMANGLE_COMPONENT_QUAL_NAME:
2794     case DEMANGLE_COMPONENT_LOCAL_NAME:
2795       d_print_comp (dpi, d_left (dc));
2796       if ((dpi->options & DMGL_JAVA) == 0)
2797         d_append_string_constant (dpi, "::");
2798       else
2799         d_append_char (dpi, '.');
2800       d_print_comp (dpi, d_right (dc));
2801       return;
2802
2803     case DEMANGLE_COMPONENT_TYPED_NAME:
2804       {
2805         struct d_print_mod *hold_modifiers;
2806         struct demangle_component *typed_name;
2807         struct d_print_mod adpm[4];
2808         unsigned int i;
2809         struct d_print_template dpt;
2810
2811         /* Pass the name down to the type so that it can be printed in
2812            the right place for the type.  We also have to pass down
2813            any CV-qualifiers, which apply to the this parameter.  */
2814         hold_modifiers = dpi->modifiers;
2815         i = 0;
2816         typed_name = d_left (dc);
2817         while (typed_name != NULL)
2818           {
2819             if (i >= sizeof adpm / sizeof adpm[0])
2820               {
2821                 d_print_error (dpi);
2822                 return;
2823               }
2824
2825             adpm[i].next = dpi->modifiers;
2826             dpi->modifiers = &adpm[i];
2827             adpm[i].mod = typed_name;
2828             adpm[i].printed = 0;
2829             adpm[i].templates = dpi->templates;
2830             ++i;
2831
2832             if (typed_name->type != DEMANGLE_COMPONENT_RESTRICT_THIS
2833                 && typed_name->type != DEMANGLE_COMPONENT_VOLATILE_THIS
2834                 && typed_name->type != DEMANGLE_COMPONENT_CONST_THIS)
2835               break;
2836
2837             typed_name = d_left (typed_name);
2838           }
2839
2840         /* If typed_name is a template, then it applies to the
2841            function type as well.  */
2842         if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
2843           {
2844             dpt.next = dpi->templates;
2845             dpi->templates = &dpt;
2846             dpt.template = typed_name;
2847           }
2848
2849         /* If typed_name is a DEMANGLE_COMPONENT_LOCAL_NAME, then
2850            there may be CV-qualifiers on its right argument which
2851            really apply here; this happens when parsing a class which
2852            is local to a function.  */
2853         if (typed_name->type == DEMANGLE_COMPONENT_LOCAL_NAME)
2854           {
2855             struct demangle_component *local_name;
2856
2857             local_name = d_right (typed_name);
2858             while (local_name->type == DEMANGLE_COMPONENT_RESTRICT_THIS
2859                    || local_name->type == DEMANGLE_COMPONENT_VOLATILE_THIS
2860                    || local_name->type == DEMANGLE_COMPONENT_CONST_THIS)
2861               {
2862                 if (i >= sizeof adpm / sizeof adpm[0])
2863                   {
2864                     d_print_error (dpi);
2865                     return;
2866                   }
2867
2868                 adpm[i] = adpm[i - 1];
2869                 adpm[i].next = &adpm[i - 1];
2870                 dpi->modifiers = &adpm[i];
2871
2872                 adpm[i - 1].mod = local_name;
2873                 adpm[i - 1].printed = 0;
2874                 adpm[i - 1].templates = dpi->templates;
2875                 ++i;
2876
2877                 local_name = d_left (local_name);
2878               }
2879           }
2880
2881         d_print_comp (dpi, d_right (dc));
2882
2883         if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
2884           dpi->templates = dpt.next;
2885
2886         /* If the modifiers didn't get printed by the type, print them
2887            now.  */
2888         while (i > 0)
2889           {
2890             --i;
2891             if (! adpm[i].printed)
2892               {
2893                 d_append_char (dpi, ' ');
2894                 d_print_mod (dpi, adpm[i].mod);
2895               }
2896           }
2897
2898         dpi->modifiers = hold_modifiers;
2899
2900         return;
2901       }
2902
2903     case DEMANGLE_COMPONENT_TEMPLATE:
2904       {
2905         struct d_print_mod *hold_dpm;
2906
2907         /* Don't push modifiers into a template definition.  Doing so
2908            could give the wrong definition for a template argument.
2909            Instead, treat the template essentially as a name.  */
2910
2911         hold_dpm = dpi->modifiers;
2912         dpi->modifiers = NULL;
2913
2914         d_print_comp (dpi, d_left (dc));
2915         if (d_last_char (dpi) == '<')
2916           d_append_char (dpi, ' ');
2917         d_append_char (dpi, '<');
2918         d_print_comp (dpi, d_right (dc));
2919         /* Avoid generating two consecutive '>' characters, to avoid
2920            the C++ syntactic ambiguity.  */
2921         if (d_last_char (dpi) == '>')
2922           d_append_char (dpi, ' ');
2923         d_append_char (dpi, '>');
2924
2925         dpi->modifiers = hold_dpm;
2926
2927         return;
2928       }
2929
2930     case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
2931       {
2932         long i;
2933         struct demangle_component *a;
2934         struct d_print_template *hold_dpt;
2935
2936         if (dpi->templates == NULL)
2937           {
2938             d_print_error (dpi);
2939             return;
2940           }
2941         i = dc->u.s_number.number;
2942         for (a = d_right (dpi->templates->template);
2943              a != NULL;
2944              a = d_right (a))
2945           {
2946             if (a->type != DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
2947               {
2948                 d_print_error (dpi);
2949                 return;
2950               }
2951             if (i <= 0)
2952               break;
2953             --i;
2954           }
2955         if (i != 0 || a == NULL)
2956           {
2957             d_print_error (dpi);
2958             return;
2959           }
2960
2961         /* While processing this parameter, we need to pop the list of
2962            templates.  This is because the template parameter may
2963            itself be a reference to a parameter of an outer
2964            template.  */
2965
2966         hold_dpt = dpi->templates;
2967         dpi->templates = hold_dpt->next;
2968
2969         d_print_comp (dpi, d_left (a));
2970
2971         dpi->templates = hold_dpt;
2972
2973         return;
2974       }
2975
2976     case DEMANGLE_COMPONENT_CTOR:
2977       d_print_comp (dpi, dc->u.s_ctor.name);
2978       return;
2979
2980     case DEMANGLE_COMPONENT_DTOR:
2981       d_append_char (dpi, '~');
2982       d_print_comp (dpi, dc->u.s_dtor.name);
2983       return;
2984
2985     case DEMANGLE_COMPONENT_VTABLE:
2986       d_append_string_constant (dpi, "vtable for ");
2987       d_print_comp (dpi, d_left (dc));
2988       return;
2989
2990     case DEMANGLE_COMPONENT_VTT:
2991       d_append_string_constant (dpi, "VTT for ");
2992       d_print_comp (dpi, d_left (dc));
2993       return;
2994
2995     case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
2996       d_append_string_constant (dpi, "construction vtable for ");
2997       d_print_comp (dpi, d_left (dc));
2998       d_append_string_constant (dpi, "-in-");
2999       d_print_comp (dpi, d_right (dc));
3000       return;
3001
3002     case DEMANGLE_COMPONENT_TYPEINFO:
3003       d_append_string_constant (dpi, "typeinfo for ");
3004       d_print_comp (dpi, d_left (dc));
3005       return;
3006
3007     case DEMANGLE_COMPONENT_TYPEINFO_NAME:
3008       d_append_string_constant (dpi, "typeinfo name for ");
3009       d_print_comp (dpi, d_left (dc));
3010       return;
3011
3012     case DEMANGLE_COMPONENT_TYPEINFO_FN:
3013       d_append_string_constant (dpi, "typeinfo fn for ");
3014       d_print_comp (dpi, d_left (dc));
3015       return;
3016
3017     case DEMANGLE_COMPONENT_THUNK:
3018       d_append_string_constant (dpi, "non-virtual thunk to ");
3019       d_print_comp (dpi, d_left (dc));
3020       return;
3021
3022     case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
3023       d_append_string_constant (dpi, "virtual thunk to ");
3024       d_print_comp (dpi, d_left (dc));
3025       return;
3026
3027     case DEMANGLE_COMPONENT_COVARIANT_THUNK:
3028       d_append_string_constant (dpi, "covariant return thunk to ");
3029       d_print_comp (dpi, d_left (dc));
3030       return;
3031
3032     case DEMANGLE_COMPONENT_JAVA_CLASS:
3033       d_append_string_constant (dpi, "java Class for ");
3034       d_print_comp (dpi, d_left (dc));
3035       return;
3036
3037     case DEMANGLE_COMPONENT_GUARD:
3038       d_append_string_constant (dpi, "guard variable for ");
3039       d_print_comp (dpi, d_left (dc));
3040       return;
3041
3042     case DEMANGLE_COMPONENT_REFTEMP:
3043       d_append_string_constant (dpi, "reference temporary for ");
3044       d_print_comp (dpi, d_left (dc));
3045       return;
3046
3047     case DEMANGLE_COMPONENT_SUB_STD:
3048       d_append_buffer (dpi, dc->u.s_string.string, dc->u.s_string.len);
3049       return;
3050
3051     case DEMANGLE_COMPONENT_RESTRICT:
3052     case DEMANGLE_COMPONENT_VOLATILE:
3053     case DEMANGLE_COMPONENT_CONST:
3054       {
3055         struct d_print_mod *pdpm;
3056
3057         /* When printing arrays, it's possible to have cases where the
3058            same CV-qualifier gets pushed on the stack multiple times.
3059            We only need to print it once.  */
3060
3061         for (pdpm = dpi->modifiers; pdpm != NULL; pdpm = pdpm->next)
3062           {
3063             if (! pdpm->printed)
3064               {
3065                 if (pdpm->mod->type != DEMANGLE_COMPONENT_RESTRICT
3066                     && pdpm->mod->type != DEMANGLE_COMPONENT_VOLATILE
3067                     && pdpm->mod->type != DEMANGLE_COMPONENT_CONST)
3068                   break;
3069                 if (pdpm->mod->type == dc->type)
3070                   {
3071                     d_print_comp (dpi, d_left (dc));
3072                     return;
3073                   }
3074               }
3075           }
3076       }
3077       /* Fall through.  */
3078     case DEMANGLE_COMPONENT_RESTRICT_THIS:
3079     case DEMANGLE_COMPONENT_VOLATILE_THIS:
3080     case DEMANGLE_COMPONENT_CONST_THIS:
3081     case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
3082     case DEMANGLE_COMPONENT_POINTER:
3083     case DEMANGLE_COMPONENT_REFERENCE:
3084     case DEMANGLE_COMPONENT_COMPLEX:
3085     case DEMANGLE_COMPONENT_IMAGINARY:
3086       {
3087         /* We keep a list of modifiers on the stack.  */
3088         struct d_print_mod dpm;
3089
3090         dpm.next = dpi->modifiers;
3091         dpi->modifiers = &dpm;
3092         dpm.mod = dc;
3093         dpm.printed = 0;
3094         dpm.templates = dpi->templates;
3095
3096         d_print_comp (dpi, d_left (dc));
3097
3098         /* If the modifier didn't get printed by the type, print it
3099            now.  */
3100         if (! dpm.printed)
3101           d_print_mod (dpi, dc);
3102
3103         dpi->modifiers = dpm.next;
3104
3105         return;
3106       }
3107
3108     case DEMANGLE_COMPONENT_BUILTIN_TYPE:
3109       if ((dpi->options & DMGL_JAVA) == 0)
3110         d_append_buffer (dpi, dc->u.s_builtin.type->name,
3111                          dc->u.s_builtin.type->len);
3112       else
3113         d_append_buffer (dpi, dc->u.s_builtin.type->java_name,
3114                          dc->u.s_builtin.type->java_len);
3115       return;
3116
3117     case DEMANGLE_COMPONENT_VENDOR_TYPE:
3118       d_print_comp (dpi, d_left (dc));
3119       return;
3120
3121     case DEMANGLE_COMPONENT_FUNCTION_TYPE:
3122       {
3123         if (d_left (dc) != NULL)
3124           {
3125             struct d_print_mod dpm;
3126
3127             /* We must pass this type down as a modifier in order to
3128                print it in the right location.  */
3129
3130             dpm.next = dpi->modifiers;
3131             dpi->modifiers = &dpm;
3132             dpm.mod = dc;
3133             dpm.printed = 0;
3134             dpm.templates = dpi->templates;
3135
3136             d_print_comp (dpi, d_left (dc));
3137
3138             dpi->modifiers = dpm.next;
3139
3140             if (dpm.printed)
3141               return;
3142
3143             d_append_char (dpi, ' ');
3144           }
3145
3146         d_print_function_type (dpi, dc, dpi->modifiers);
3147
3148         return;
3149       }
3150
3151     case DEMANGLE_COMPONENT_ARRAY_TYPE:
3152       {
3153         struct d_print_mod *hold_modifiers;
3154         struct d_print_mod adpm[4];
3155         unsigned int i;
3156         struct d_print_mod *pdpm;
3157
3158         /* We must pass this type down as a modifier in order to print
3159            multi-dimensional arrays correctly.  If the array itself is
3160            CV-qualified, we act as though the element type were
3161            CV-qualified.  We do this by copying the modifiers down
3162            rather than fiddling pointers, so that we don't wind up
3163            with a d_print_mod higher on the stack pointing into our
3164            stack frame after we return.  */
3165
3166         hold_modifiers = dpi->modifiers;
3167
3168         adpm[0].next = hold_modifiers;
3169         dpi->modifiers = &adpm[0];
3170         adpm[0].mod = dc;
3171         adpm[0].printed = 0;
3172         adpm[0].templates = dpi->templates;
3173
3174         i = 1;
3175         pdpm = hold_modifiers;
3176         while (pdpm != NULL
3177                && (pdpm->mod->type == DEMANGLE_COMPONENT_RESTRICT
3178                    || pdpm->mod->type == DEMANGLE_COMPONENT_VOLATILE
3179                    || pdpm->mod->type == DEMANGLE_COMPONENT_CONST))
3180           {
3181             if (! pdpm->printed)
3182               {
3183                 if (i >= sizeof adpm / sizeof adpm[0])
3184                   {
3185                     d_print_error (dpi);
3186                     return;
3187                   }
3188
3189                 adpm[i] = *pdpm;
3190                 adpm[i].next = dpi->modifiers;
3191                 dpi->modifiers = &adpm[i];
3192                 pdpm->printed = 1;
3193                 ++i;
3194               }
3195
3196             pdpm = pdpm->next;
3197           }
3198
3199         d_print_comp (dpi, d_right (dc));
3200
3201         dpi->modifiers = hold_modifiers;
3202
3203         if (adpm[0].printed)
3204           return;
3205
3206         while (i > 1)
3207           {
3208             --i;
3209             d_print_mod (dpi, adpm[i].mod);
3210           }
3211
3212         d_print_array_type (dpi, dc, dpi->modifiers);
3213
3214         return;
3215       }
3216
3217     case DEMANGLE_COMPONENT_PTRMEM_TYPE:
3218       {
3219         struct d_print_mod dpm;
3220
3221         dpm.next = dpi->modifiers;
3222         dpi->modifiers = &dpm;
3223         dpm.mod = dc;
3224         dpm.printed = 0;
3225         dpm.templates = dpi->templates;
3226
3227         d_print_comp (dpi, d_right (dc));
3228
3229         /* If the modifier didn't get printed by the type, print it
3230            now.  */
3231         if (! dpm.printed)
3232           {
3233             d_append_char (dpi, ' ');
3234             d_print_comp (dpi, d_left (dc));
3235             d_append_string_constant (dpi, "::*");
3236           }
3237
3238         dpi->modifiers = dpm.next;
3239
3240         return;
3241       }
3242
3243     case DEMANGLE_COMPONENT_ARGLIST:
3244     case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
3245       d_print_comp (dpi, d_left (dc));
3246       if (d_right (dc) != NULL)
3247         {
3248           d_append_string_constant (dpi, ", ");
3249           d_print_comp (dpi, d_right (dc));
3250         }
3251       return;
3252
3253     case DEMANGLE_COMPONENT_OPERATOR:
3254       {
3255         char c;
3256
3257         d_append_string_constant (dpi, "operator");
3258         c = dc->u.s_operator.op->name[0];
3259         if (IS_LOWER (c))
3260           d_append_char (dpi, ' ');
3261         d_append_buffer (dpi, dc->u.s_operator.op->name,
3262                          dc->u.s_operator.op->len);
3263         return;
3264       }
3265
3266     case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
3267       d_append_string_constant (dpi, "operator ");
3268       d_print_comp (dpi, dc->u.s_extended_operator.name);
3269       return;
3270
3271     case DEMANGLE_COMPONENT_CAST:
3272       d_append_string_constant (dpi, "operator ");
3273       d_print_cast (dpi, dc);
3274       return;
3275
3276     case DEMANGLE_COMPONENT_UNARY:
3277       if (d_left (dc)->type != DEMANGLE_COMPONENT_CAST)
3278         d_print_expr_op (dpi, d_left (dc));
3279       else
3280         {
3281           d_append_char (dpi, '(');
3282           d_print_cast (dpi, d_left (dc));
3283           d_append_char (dpi, ')');
3284         }
3285       d_append_char (dpi, '(');
3286       d_print_comp (dpi, d_right (dc));
3287       d_append_char (dpi, ')');
3288       return;
3289
3290     case DEMANGLE_COMPONENT_BINARY:
3291       if (d_right (dc)->type != DEMANGLE_COMPONENT_BINARY_ARGS)
3292         {
3293           d_print_error (dpi);
3294           return;
3295         }
3296
3297       /* We wrap an expression which uses the greater-than operator in
3298          an extra layer of parens so that it does not get confused
3299          with the '>' which ends the template parameters.  */
3300       if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
3301           && d_left (dc)->u.s_operator.op->len == 1
3302           && d_left (dc)->u.s_operator.op->name[0] == '>')
3303         d_append_char (dpi, '(');
3304
3305       d_append_char (dpi, '(');
3306       d_print_comp (dpi, d_left (d_right (dc)));
3307       d_append_string_constant (dpi, ") ");
3308       d_print_expr_op (dpi, d_left (dc));
3309       d_append_string_constant (dpi, " (");
3310       d_print_comp (dpi, d_right (d_right (dc)));
3311       d_append_char (dpi, ')');
3312
3313       if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
3314           && d_left (dc)->u.s_operator.op->len == 1
3315           && d_left (dc)->u.s_operator.op->name[0] == '>')
3316         d_append_char (dpi, ')');
3317
3318       return;
3319
3320     case DEMANGLE_COMPONENT_BINARY_ARGS:
3321       /* We should only see this as part of DEMANGLE_COMPONENT_BINARY.  */
3322       d_print_error (dpi);
3323       return;
3324
3325     case DEMANGLE_COMPONENT_TRINARY:
3326       if (d_right (dc)->type != DEMANGLE_COMPONENT_TRINARY_ARG1
3327           || d_right (d_right (dc))->type != DEMANGLE_COMPONENT_TRINARY_ARG2)
3328         {
3329           d_print_error (dpi);
3330           return;
3331         }
3332       d_append_char (dpi, '(');
3333       d_print_comp (dpi, d_left (d_right (dc)));
3334       d_append_string_constant (dpi, ") ");
3335       d_print_expr_op (dpi, d_left (dc));
3336       d_append_string_constant (dpi, " (");
3337       d_print_comp (dpi, d_left (d_right (d_right (dc))));
3338       d_append_string_constant (dpi, ") : (");
3339       d_print_comp (dpi, d_right (d_right (d_right (dc))));
3340       d_append_char (dpi, ')');
3341       return;
3342
3343     case DEMANGLE_COMPONENT_TRINARY_ARG1:
3344     case DEMANGLE_COMPONENT_TRINARY_ARG2:
3345       /* We should only see these are part of DEMANGLE_COMPONENT_TRINARY.  */
3346       d_print_error (dpi);
3347       return;
3348
3349     case DEMANGLE_COMPONENT_LITERAL:
3350     case DEMANGLE_COMPONENT_LITERAL_NEG:
3351       {
3352         enum d_builtin_type_print tp;
3353
3354         /* For some builtin types, produce simpler output.  */
3355         tp = D_PRINT_DEFAULT;
3356         if (d_left (dc)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE)
3357           {
3358             tp = d_left (dc)->u.s_builtin.type->print;
3359             switch (tp)
3360               {
3361               case D_PRINT_INT:
3362               case D_PRINT_UNSIGNED:
3363               case D_PRINT_LONG:
3364               case D_PRINT_UNSIGNED_LONG:
3365               case D_PRINT_LONG_LONG:
3366               case D_PRINT_UNSIGNED_LONG_LONG:
3367                 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME)
3368                   {
3369                     if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
3370                       d_append_char (dpi, '-');
3371                     d_print_comp (dpi, d_right (dc));
3372                     switch (tp)
3373                       {
3374                       default:
3375                         break;
3376                       case D_PRINT_UNSIGNED:
3377                         d_append_char (dpi, 'u');
3378                         break;
3379                       case D_PRINT_LONG:
3380                         d_append_char (dpi, 'l');
3381                         break;
3382                       case D_PRINT_UNSIGNED_LONG:
3383                         d_append_string_constant (dpi, "ul");
3384                         break;
3385                       case D_PRINT_LONG_LONG:
3386                         d_append_string_constant (dpi, "ll");
3387                         break;
3388                       case D_PRINT_UNSIGNED_LONG_LONG:
3389                         d_append_string_constant (dpi, "ull");
3390                         break;
3391                       }
3392                     return;
3393                   }
3394                 break;
3395
3396               case D_PRINT_BOOL:
3397                 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME
3398                     && d_right (dc)->u.s_name.len == 1
3399                     && dc->type == DEMANGLE_COMPONENT_LITERAL)
3400                   {
3401                     switch (d_right (dc)->u.s_name.s[0])
3402                       {
3403                       case '0':
3404                         d_append_string_constant (dpi, "false");
3405                         return;
3406                       case '1':
3407                         d_append_string_constant (dpi, "true");
3408                         return;
3409                       default:
3410                         break;
3411                       }
3412                   }
3413                 break;
3414
3415               default:
3416                 break;
3417               }
3418           }
3419
3420         d_append_char (dpi, '(');
3421         d_print_comp (dpi, d_left (dc));
3422         d_append_char (dpi, ')');
3423         if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
3424           d_append_char (dpi, '-');
3425         if (tp == D_PRINT_FLOAT)
3426           d_append_char (dpi, '[');
3427         d_print_comp (dpi, d_right (dc));
3428         if (tp == D_PRINT_FLOAT)
3429           d_append_char (dpi, ']');
3430       }
3431       return;
3432
3433     default:
3434       d_print_error (dpi);
3435       return;
3436     }
3437 }
3438
3439 /* Print a Java dentifier.  For Java we try to handle encoded extended
3440    Unicode characters.  The C++ ABI doesn't mention Unicode encoding,
3441    so we don't it for C++.  Characters are encoded as
3442    __U<hex-char>+_.  */
3443
3444 static void
3445 d_print_java_identifier (dpi, name, len)
3446      struct d_print_info *dpi;
3447      const char *name;
3448      int len;
3449 {
3450   const char *p;
3451   const char *end;
3452
3453   end = name + len;
3454   for (p = name; p < end; ++p)
3455     {
3456       if (end - p > 3
3457           && p[0] == '_'
3458           && p[1] == '_'
3459           && p[2] == 'U')
3460         {
3461           unsigned long c;
3462           const char *q;
3463
3464           c = 0;
3465           for (q = p + 3; q < end; ++q)
3466             {
3467               int dig;
3468
3469               if (IS_DIGIT (*q))
3470                 dig = *q - '0';
3471               else if (*q >= 'A' && *q <= 'F')
3472                 dig = *q - 'A' + 10;
3473               else if (*q >= 'a' && *q <= 'f')
3474                 dig = *q - 'a' + 10;
3475               else
3476                 break;
3477
3478               c = c * 16 + dig;
3479             }
3480           /* If the Unicode character is larger than 256, we don't try
3481              to deal with it here.  FIXME.  */
3482           if (q < end && *q == '_' && c < 256)
3483             {
3484               d_append_char (dpi, c);
3485               p = q;
3486               continue;
3487             }
3488         }
3489
3490       d_append_char (dpi, *p);
3491     }
3492 }
3493
3494 /* Print a list of modifiers.  SUFFIX is 1 if we are printing
3495    qualifiers on this after printing a function.  */
3496
3497 static void
3498 d_print_mod_list (dpi, mods, suffix)
3499      struct d_print_info *dpi;
3500      struct d_print_mod *mods;
3501      int suffix;
3502 {
3503   struct d_print_template *hold_dpt;
3504
3505   if (mods == NULL || d_print_saw_error (dpi))
3506     return;
3507
3508   if (mods->printed
3509       || (! suffix
3510           && (mods->mod->type == DEMANGLE_COMPONENT_RESTRICT_THIS
3511               || mods->mod->type == DEMANGLE_COMPONENT_VOLATILE_THIS
3512               || mods->mod->type == DEMANGLE_COMPONENT_CONST_THIS)))
3513     {
3514       d_print_mod_list (dpi, mods->next, suffix);
3515       return;
3516     }
3517
3518   mods->printed = 1;
3519
3520   hold_dpt = dpi->templates;
3521   dpi->templates = mods->templates;
3522
3523   if (mods->mod->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
3524     {
3525       d_print_function_type (dpi, mods->mod, mods->next);
3526       dpi->templates = hold_dpt;
3527       return;
3528     }
3529   else if (mods->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
3530     {
3531       d_print_array_type (dpi, mods->mod, mods->next);
3532       dpi->templates = hold_dpt;
3533       return;
3534     }
3535   else if (mods->mod->type == DEMANGLE_COMPONENT_LOCAL_NAME)
3536     {
3537       struct d_print_mod *hold_modifiers;
3538       struct demangle_component *dc;
3539
3540       /* When this is on the modifier stack, we have pulled any
3541          qualifiers off the right argument already.  Otherwise, we
3542          print it as usual, but don't let the left argument see any
3543          modifiers.  */
3544
3545       hold_modifiers = dpi->modifiers;
3546       dpi->modifiers = NULL;
3547       d_print_comp (dpi, d_left (mods->mod));
3548       dpi->modifiers = hold_modifiers;
3549
3550       if ((dpi->options & DMGL_JAVA) == 0)
3551         d_append_string_constant (dpi, "::");
3552       else
3553         d_append_char (dpi, '.');
3554
3555       dc = d_right (mods->mod);
3556       while (dc->type == DEMANGLE_COMPONENT_RESTRICT_THIS
3557              || dc->type == DEMANGLE_COMPONENT_VOLATILE_THIS
3558              || dc->type == DEMANGLE_COMPONENT_CONST_THIS)
3559         dc = d_left (dc);
3560
3561       d_print_comp (dpi, dc);
3562
3563       dpi->templates = hold_dpt;
3564       return;
3565     }
3566
3567   d_print_mod (dpi, mods->mod);
3568
3569   dpi->templates = hold_dpt;
3570
3571   d_print_mod_list (dpi, mods->next, suffix);
3572 }
3573
3574 /* Print a modifier.  */
3575
3576 static void
3577 d_print_mod (dpi, mod)
3578      struct d_print_info *dpi;
3579      const struct demangle_component *mod;
3580 {
3581   switch (mod->type)
3582     {
3583     case DEMANGLE_COMPONENT_RESTRICT:
3584     case DEMANGLE_COMPONENT_RESTRICT_THIS:
3585       d_append_string_constant (dpi, " restrict");
3586       return;
3587     case DEMANGLE_COMPONENT_VOLATILE:
3588     case DEMANGLE_COMPONENT_VOLATILE_THIS:
3589       d_append_string_constant (dpi, " volatile");
3590       return;
3591     case DEMANGLE_COMPONENT_CONST:
3592     case DEMANGLE_COMPONENT_CONST_THIS:
3593       d_append_string_constant (dpi, " const");
3594       return;
3595     case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
3596       d_append_char (dpi, ' ');
3597       d_print_comp (dpi, d_right (mod));
3598       return;
3599     case DEMANGLE_COMPONENT_POINTER:
3600       /* There is no pointer symbol in Java.  */
3601       if ((dpi->options & DMGL_JAVA) == 0)
3602         d_append_char (dpi, '*');
3603       return;
3604     case DEMANGLE_COMPONENT_REFERENCE:
3605       d_append_char (dpi, '&');
3606       return;
3607     case DEMANGLE_COMPONENT_COMPLEX:
3608       d_append_string_constant (dpi, "complex ");
3609       return;
3610     case DEMANGLE_COMPONENT_IMAGINARY:
3611       d_append_string_constant (dpi, "imaginary ");
3612       return;
3613     case DEMANGLE_COMPONENT_PTRMEM_TYPE:
3614       if (d_last_char (dpi) != '(')
3615         d_append_char (dpi, ' ');
3616       d_print_comp (dpi, d_left (mod));
3617       d_append_string_constant (dpi, "::*");
3618       return;
3619     case DEMANGLE_COMPONENT_TYPED_NAME:
3620       d_print_comp (dpi, d_left (mod));
3621       return;
3622     default:
3623       /* Otherwise, we have something that won't go back on the
3624          modifier stack, so we can just print it.  */
3625       d_print_comp (dpi, mod);
3626       return;
3627     }
3628 }
3629
3630 /* Print a function type, except for the return type.  */
3631
3632 static void
3633 d_print_function_type (dpi, dc, mods)
3634      struct d_print_info *dpi;
3635      const struct demangle_component *dc;
3636      struct d_print_mod *mods;
3637 {
3638   int need_paren;
3639   int saw_mod;
3640   int need_space;
3641   struct d_print_mod *p;
3642   struct d_print_mod *hold_modifiers;
3643
3644   need_paren = 0;
3645   saw_mod = 0;
3646   need_space = 0;
3647   for (p = mods; p != NULL; p = p->next)
3648     {
3649       if (p->printed)
3650         break;
3651
3652       saw_mod = 1;
3653       switch (p->mod->type)
3654         {
3655         case DEMANGLE_COMPONENT_POINTER:
3656         case DEMANGLE_COMPONENT_REFERENCE:
3657           need_paren = 1;
3658           break;
3659         case DEMANGLE_COMPONENT_RESTRICT:
3660         case DEMANGLE_COMPONENT_VOLATILE:
3661         case DEMANGLE_COMPONENT_CONST:
3662         case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
3663         case DEMANGLE_COMPONENT_COMPLEX:
3664         case DEMANGLE_COMPONENT_IMAGINARY:
3665         case DEMANGLE_COMPONENT_PTRMEM_TYPE:
3666           need_space = 1;
3667           need_paren = 1;
3668           break;
3669         case DEMANGLE_COMPONENT_RESTRICT_THIS:
3670         case DEMANGLE_COMPONENT_VOLATILE_THIS:
3671         case DEMANGLE_COMPONENT_CONST_THIS:
3672           break;
3673         default:
3674           break;
3675         }
3676       if (need_paren)
3677         break;
3678     }
3679
3680   if (d_left (dc) != NULL && ! saw_mod)
3681     need_paren = 1;
3682
3683   if (need_paren)
3684     {
3685       if (! need_space)
3686         {
3687           if (d_last_char (dpi) != '('
3688               && d_last_char (dpi) != '*')
3689             need_space = 1;
3690         }
3691       if (need_space && d_last_char (dpi) != ' ')
3692         d_append_char (dpi, ' ');
3693       d_append_char (dpi, '(');
3694     }
3695
3696   hold_modifiers = dpi->modifiers;
3697   dpi->modifiers = NULL;
3698
3699   d_print_mod_list (dpi, mods, 0);
3700
3701   if (need_paren)
3702     d_append_char (dpi, ')');
3703
3704   d_append_char (dpi, '(');
3705
3706   if (d_right (dc) != NULL)
3707     d_print_comp (dpi, d_right (dc));
3708
3709   d_append_char (dpi, ')');
3710
3711   d_print_mod_list (dpi, mods, 1);
3712
3713   dpi->modifiers = hold_modifiers;
3714 }
3715
3716 /* Print an array type, except for the element type.  */
3717
3718 static void
3719 d_print_array_type (dpi, dc, mods)
3720      struct d_print_info *dpi;
3721      const struct demangle_component *dc;
3722      struct d_print_mod *mods;
3723 {
3724   int need_space;
3725
3726   need_space = 1;
3727   if (mods != NULL)
3728     {
3729       int need_paren;
3730       struct d_print_mod *p;
3731
3732       need_paren = 0;
3733       for (p = mods; p != NULL; p = p->next)
3734         {
3735           if (! p->printed)
3736             {
3737               if (p->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
3738                 {
3739                   need_space = 0;
3740                   break;
3741                 }
3742               else
3743                 {
3744                   need_paren = 1;
3745                   need_space = 1;
3746                   break;
3747                 }
3748             }
3749         }
3750
3751       if (need_paren)
3752         d_append_string_constant (dpi, " (");
3753
3754       d_print_mod_list (dpi, mods, 0);
3755
3756       if (need_paren)
3757         d_append_char (dpi, ')');
3758     }
3759
3760   if (need_space)
3761     d_append_char (dpi, ' ');
3762
3763   d_append_char (dpi, '[');
3764
3765   if (d_left (dc) != NULL)
3766     d_print_comp (dpi, d_left (dc));
3767
3768   d_append_char (dpi, ']');
3769 }
3770
3771 /* Print an operator in an expression.  */
3772
3773 static void
3774 d_print_expr_op (dpi, dc)
3775      struct d_print_info *dpi;
3776      const struct demangle_component *dc;
3777 {
3778   if (dc->type == DEMANGLE_COMPONENT_OPERATOR)
3779     d_append_buffer (dpi, dc->u.s_operator.op->name,
3780                      dc->u.s_operator.op->len);
3781   else
3782     d_print_comp (dpi, dc);
3783 }
3784
3785 /* Print a cast.  */
3786
3787 static void
3788 d_print_cast (dpi, dc)
3789      struct d_print_info *dpi;
3790      const struct demangle_component *dc;
3791 {
3792   if (d_left (dc)->type != DEMANGLE_COMPONENT_TEMPLATE)
3793     d_print_comp (dpi, d_left (dc));
3794   else
3795     {
3796       struct d_print_mod *hold_dpm;
3797       struct d_print_template dpt;
3798
3799       /* It appears that for a templated cast operator, we need to put
3800          the template parameters in scope for the operator name, but
3801          not for the parameters.  The effect is that we need to handle
3802          the template printing here.  */
3803
3804       hold_dpm = dpi->modifiers;
3805       dpi->modifiers = NULL;
3806
3807       dpt.next = dpi->templates;
3808       dpi->templates = &dpt;
3809       dpt.template = d_left (dc);
3810
3811       d_print_comp (dpi, d_left (d_left (dc)));
3812
3813       dpi->templates = dpt.next;
3814
3815       if (d_last_char (dpi) == '<')
3816         d_append_char (dpi, ' ');
3817       d_append_char (dpi, '<');
3818       d_print_comp (dpi, d_right (d_left (dc)));
3819       /* Avoid generating two consecutive '>' characters, to avoid
3820          the C++ syntactic ambiguity.  */
3821       if (d_last_char (dpi) == '>')
3822         d_append_char (dpi, ' ');
3823       d_append_char (dpi, '>');
3824
3825       dpi->modifiers = hold_dpm;
3826     }
3827 }
3828
3829 /* Initialize the information structure we use to pass around
3830    information.  */
3831
3832 CP_STATIC_IF_GLIBCPP_V3
3833 void
3834 cplus_demangle_init_info (mangled, options, len, di)
3835      const char *mangled;
3836      int options;
3837      size_t len;
3838      struct d_info *di;
3839 {
3840   di->s = mangled;
3841   di->send = mangled + len;
3842   di->options = options;
3843
3844   di->n = mangled;
3845
3846   /* We can not need more components than twice the number of chars in
3847      the mangled string.  Most components correspond directly to
3848      chars, but the ARGLIST types are exceptions.  */
3849   di->num_comps = 2 * len;
3850   di->next_comp = 0;
3851
3852   /* Similarly, we can not need more substitutions than there are
3853      chars in the mangled string.  */
3854   di->num_subs = len;
3855   di->next_sub = 0;
3856   di->did_subs = 0;
3857
3858   di->last_name = NULL;
3859
3860   di->expansion = 0;
3861 }
3862
3863 /* Entry point for the demangler.  If MANGLED is a g++ v3 ABI mangled
3864    name, return a buffer allocated with malloc holding the demangled
3865    name.  OPTIONS is the usual libiberty demangler options.  On
3866    success, this sets *PALC to the allocated size of the returned
3867    buffer.  On failure, this sets *PALC to 0 for a bad name, or 1 for
3868    a memory allocation failure.  On failure, this returns NULL.  */
3869
3870 static char *
3871 d_demangle (mangled, options, palc)
3872      const char* mangled;
3873      int options;
3874      size_t *palc;
3875 {
3876   size_t len;
3877   int type;
3878   struct d_info di;
3879   struct demangle_component *dc;
3880   int estimate;
3881   char *ret;
3882
3883   *palc = 0;
3884
3885   len = strlen (mangled);
3886
3887   if (mangled[0] == '_' && mangled[1] == 'Z')
3888     type = 0;
3889   else if (strncmp (mangled, "_GLOBAL_", 8) == 0
3890            && (mangled[8] == '.' || mangled[8] == '_' || mangled[8] == '$')
3891            && (mangled[9] == 'D' || mangled[9] == 'I')
3892            && mangled[10] == '_')
3893     {
3894       char *r;
3895
3896       r = malloc (40 + len - 11);
3897       if (r == NULL)
3898         *palc = 1;
3899       else
3900         {
3901           if (mangled[9] == 'I')
3902             strcpy (r, "global constructors keyed to ");
3903           else
3904             strcpy (r, "global destructors keyed to ");
3905           strcat (r, mangled + 11);
3906         }
3907       return r;
3908     }
3909   else
3910     {
3911       if ((options & DMGL_TYPES) == 0)
3912         return NULL;
3913       type = 1;
3914     }
3915
3916   cplus_demangle_init_info (mangled, options, len, &di);
3917
3918   {
3919 #ifdef CP_DYNAMIC_ARRAYS
3920     __extension__ struct demangle_component comps[di.num_comps];
3921     __extension__ struct demangle_component *subs[di.num_subs];
3922
3923     di.comps = &comps[0];
3924     di.subs = &subs[0];
3925 #else
3926     di.comps = ((struct demangle_component *)
3927                 malloc (di.num_comps * sizeof (struct demangle_component)));
3928     di.subs = ((struct demangle_component **)
3929                malloc (di.num_subs * sizeof (struct demangle_component *)));
3930     if (di.comps == NULL || di.subs == NULL)
3931       {
3932         if (di.comps != NULL)
3933           free (di.comps);
3934         if (di.subs != NULL)
3935           free (di.subs);
3936         *palc = 1;
3937         return NULL;
3938       }
3939 #endif
3940
3941     if (! type)
3942       dc = cplus_demangle_mangled_name (&di, 1);
3943     else
3944       dc = cplus_demangle_type (&di);
3945
3946     /* If DMGL_PARAMS is set, then if we didn't consume the entire
3947        mangled string, then we didn't successfully demangle it.  If
3948        DMGL_PARAMS is not set, we didn't look at the trailing
3949        parameters.  */
3950     if (((options & DMGL_PARAMS) != 0) && d_peek_char (&di) != '\0')
3951       dc = NULL;
3952
3953 #ifdef CP_DEMANGLE_DEBUG
3954     if (dc == NULL)
3955       printf ("failed demangling\n");
3956     else
3957       d_dump (dc, 0);
3958 #endif
3959
3960     /* We try to guess the length of the demangled string, to minimize
3961        calls to realloc during demangling.  */
3962     estimate = len + di.expansion + 10 * di.did_subs;
3963     estimate += estimate / 8;
3964
3965     ret = NULL;
3966     if (dc != NULL)
3967       ret = cplus_demangle_print (options, dc, estimate, palc);
3968
3969 #ifndef CP_DYNAMIC_ARRAYS
3970     free (di.comps);
3971     free (di.subs);
3972 #endif
3973
3974 #ifdef CP_DEMANGLE_DEBUG
3975     if (ret != NULL)
3976       {
3977         int rlen;
3978
3979         rlen = strlen (ret);
3980         if (rlen > 2 * estimate)
3981           printf ("*** Length %d much greater than estimate %d\n",
3982                   rlen, estimate);
3983         else if (rlen > estimate)
3984           printf ("*** Length %d greater than estimate %d\n",
3985                   rlen, estimate);
3986         else if (rlen < estimate / 2)
3987           printf ("*** Length %d much less than estimate %d\n",
3988                   rlen, estimate);
3989       }
3990 #endif
3991   }
3992
3993   return ret;
3994 }
3995
3996 #if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3)
3997
3998 extern char *__cxa_demangle PARAMS ((const char *, char *, size_t *, int *));
3999
4000 /* ia64 ABI-mandated entry point in the C++ runtime library for
4001    performing demangling.  MANGLED_NAME is a NUL-terminated character
4002    string containing the name to be demangled.
4003
4004    OUTPUT_BUFFER is a region of memory, allocated with malloc, of
4005    *LENGTH bytes, into which the demangled name is stored.  If
4006    OUTPUT_BUFFER is not long enough, it is expanded using realloc.
4007    OUTPUT_BUFFER may instead be NULL; in that case, the demangled name
4008    is placed in a region of memory allocated with malloc.
4009
4010    If LENGTH is non-NULL, the length of the buffer conaining the
4011    demangled name, is placed in *LENGTH.
4012
4013    The return value is a pointer to the start of the NUL-terminated
4014    demangled name, or NULL if the demangling fails.  The caller is
4015    responsible for deallocating this memory using free.
4016
4017    *STATUS is set to one of the following values:
4018       0: The demangling operation succeeded.
4019      -1: A memory allocation failure occurred.
4020      -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
4021      -3: One of the arguments is invalid.
4022
4023    The demangling is performed using the C++ ABI mangling rules, with
4024    GNU extensions.  */
4025
4026 char *
4027 __cxa_demangle (mangled_name, output_buffer, length, status)
4028      const char *mangled_name;
4029      char *output_buffer;
4030      size_t *length;
4031      int *status;
4032 {
4033   char *demangled;
4034   size_t alc;
4035
4036   if (mangled_name == NULL)
4037     {
4038       if (status != NULL)
4039         *status = -3;
4040       return NULL;
4041     }
4042
4043   if (output_buffer != NULL && length == NULL)
4044     {
4045       if (status != NULL)
4046         *status = -3;
4047       return NULL;
4048     }
4049
4050   /* The specification for __cxa_demangle() is that if the mangled
4051      name could be either an extern "C" identifier, or an internal
4052      built-in type name, then we resolve it as the identifier.  All
4053      internal built-in type names are a single lower case character.
4054      Frankly, this simplistic disambiguation doesn't make sense to me,
4055      but it is documented, so we implement it here.  */
4056   if (IS_LOWER (mangled_name[0])
4057       && mangled_name[1] == '\0'
4058       && cplus_demangle_builtin_types[mangled_name[0] - 'a'].name != NULL)
4059     {
4060       if (status != NULL)
4061         *status = -2;
4062       return NULL;
4063     }
4064
4065   demangled = d_demangle (mangled_name, DMGL_PARAMS | DMGL_TYPES, &alc);
4066
4067   if (demangled == NULL)
4068     {
4069       if (status != NULL)
4070         {
4071           if (alc == 1)
4072             *status = -1;
4073           else
4074             *status = -2;
4075         }
4076       return NULL;
4077     }
4078
4079   if (output_buffer == NULL)
4080     {
4081       if (length != NULL)
4082         *length = alc;
4083     }
4084   else
4085     {
4086       if (strlen (demangled) < *length)
4087         {
4088           strcpy (output_buffer, demangled);
4089           free (demangled);
4090           demangled = output_buffer;
4091         }
4092       else
4093         {
4094           free (output_buffer);
4095           *length = alc;
4096         }
4097     }
4098
4099   if (status != NULL)
4100     *status = 0;
4101
4102   return demangled;
4103 }
4104
4105 #else /* ! (IN_LIBGCC2 || IN_GLIBCPP_V3) */
4106
4107 /* Entry point for libiberty demangler.  If MANGLED is a g++ v3 ABI
4108    mangled name, return a buffer allocated with malloc holding the
4109    demangled name.  Otherwise, return NULL.  */
4110
4111 char *
4112 cplus_demangle_v3 (mangled, options)
4113      const char* mangled;
4114      int options;
4115 {
4116   size_t alc;
4117
4118   return d_demangle (mangled, options, &alc);
4119 }
4120
4121 /* Demangle a Java symbol.  Java uses a subset of the V3 ABI C++ mangling 
4122    conventions, but the output formatting is a little different.
4123    This instructs the C++ demangler not to emit pointer characters ("*"), and 
4124    to use Java's namespace separator symbol ("." instead of "::").  It then 
4125    does an additional pass over the demangled output to replace instances 
4126    of JArray<TYPE> with TYPE[].  */
4127
4128 char *
4129 java_demangle_v3 (mangled)
4130      const char* mangled;
4131 {
4132   size_t alc;
4133   char *demangled;
4134   int nesting;
4135   char *from;
4136   char *to;
4137
4138   demangled = d_demangle (mangled, DMGL_JAVA | DMGL_PARAMS, &alc);
4139
4140   if (demangled == NULL)
4141     return NULL;
4142
4143   nesting = 0;
4144   from = demangled;
4145   to = from;
4146   while (*from != '\0')
4147     {
4148       if (strncmp (from, "JArray<", 7) == 0)
4149         {
4150           from += 7;
4151           ++nesting;
4152         }
4153       else if (nesting > 0 && *from == '>')
4154         {
4155           while (to > demangled && to[-1] == ' ')
4156             --to;
4157           *to++ = '[';
4158           *to++ = ']';
4159           --nesting;
4160           ++from;
4161         }
4162       else
4163         *to++ = *from++;
4164     }
4165
4166   *to = '\0';
4167
4168   return demangled;
4169 }
4170
4171 #endif /* IN_LIBGCC2 || IN_GLIBCPP_V3 */
4172
4173 #ifndef IN_GLIBCPP_V3
4174
4175 /* Demangle a string in order to find out whether it is a constructor
4176    or destructor.  Return non-zero on success.  Set *CTOR_KIND and
4177    *DTOR_KIND appropriately.  */
4178
4179 static int
4180 is_ctor_or_dtor (mangled, ctor_kind, dtor_kind)
4181      const char *mangled;
4182      enum gnu_v3_ctor_kinds *ctor_kind;
4183      enum gnu_v3_dtor_kinds *dtor_kind;
4184 {
4185   struct d_info di;
4186   struct demangle_component *dc;
4187   int ret;
4188
4189   *ctor_kind = (enum gnu_v3_ctor_kinds) 0;
4190   *dtor_kind = (enum gnu_v3_dtor_kinds) 0;
4191
4192   cplus_demangle_init_info (mangled, DMGL_GNU_V3, strlen (mangled), &di);
4193
4194   {
4195 #ifdef CP_DYNAMIC_ARRAYS
4196     __extension__ struct demangle_component comps[di.num_comps];
4197     __extension__ struct demangle_component *subs[di.num_subs];
4198
4199     di.comps = &comps[0];
4200     di.subs = &subs[0];
4201 #else
4202     di.comps = ((struct demangle_component *)
4203                 malloc (di.num_comps * sizeof (struct demangle_component)));
4204     di.subs = ((struct demangle_component **)
4205                malloc (di.num_subs * sizeof (struct demangle_component *)));
4206     if (di.comps == NULL || di.subs == NULL)
4207       {
4208         if (di.comps != NULL)
4209           free (di.comps);
4210         if (di.subs != NULL)
4211           free (di.subs);
4212         return 0;
4213       }
4214 #endif
4215
4216     dc = cplus_demangle_mangled_name (&di, 1);
4217
4218     /* Note that because we did not pass DMGL_PARAMS, we don't expect
4219        to demangle the entire string.  */
4220
4221     ret = 0;
4222     while (dc != NULL)
4223       {
4224         switch (dc->type)
4225           {
4226           default:
4227             dc = NULL;
4228             break;
4229           case DEMANGLE_COMPONENT_TYPED_NAME:
4230           case DEMANGLE_COMPONENT_TEMPLATE:
4231           case DEMANGLE_COMPONENT_RESTRICT_THIS:
4232           case DEMANGLE_COMPONENT_VOLATILE_THIS:
4233           case DEMANGLE_COMPONENT_CONST_THIS:
4234             dc = d_left (dc);
4235             break;
4236           case DEMANGLE_COMPONENT_QUAL_NAME:
4237           case DEMANGLE_COMPONENT_LOCAL_NAME:
4238             dc = d_right (dc);
4239             break;
4240           case DEMANGLE_COMPONENT_CTOR:
4241             *ctor_kind = dc->u.s_ctor.kind;
4242             ret = 1;
4243             dc = NULL;
4244             break;
4245           case DEMANGLE_COMPONENT_DTOR:
4246             *dtor_kind = dc->u.s_dtor.kind;
4247             ret = 1;
4248             dc = NULL;
4249             break;
4250           }
4251       }
4252
4253 #ifndef CP_DYNAMIC_ARRAYS
4254     free (di.subs);
4255     free (di.comps);
4256 #endif
4257   }
4258
4259   return ret;
4260 }
4261
4262 /* Return whether NAME is the mangled form of a g++ V3 ABI constructor
4263    name.  A non-zero return indicates the type of constructor.  */
4264
4265 enum gnu_v3_ctor_kinds
4266 is_gnu_v3_mangled_ctor (name)
4267      const char *name;
4268 {
4269   enum gnu_v3_ctor_kinds ctor_kind;
4270   enum gnu_v3_dtor_kinds dtor_kind;
4271
4272   if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
4273     return (enum gnu_v3_ctor_kinds) 0;
4274   return ctor_kind;
4275 }
4276
4277
4278 /* Return whether NAME is the mangled form of a g++ V3 ABI destructor
4279    name.  A non-zero return indicates the type of destructor.  */
4280
4281 enum gnu_v3_dtor_kinds
4282 is_gnu_v3_mangled_dtor (name)
4283      const char *name;
4284 {
4285   enum gnu_v3_ctor_kinds ctor_kind;
4286   enum gnu_v3_dtor_kinds dtor_kind;
4287
4288   if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
4289     return (enum gnu_v3_dtor_kinds) 0;
4290   return dtor_kind;
4291 }
4292
4293 #endif /* IN_GLIBCPP_V3 */
4294
4295 #ifdef STANDALONE_DEMANGLER
4296
4297 #include "getopt.h"
4298 #include "dyn-string.h"
4299
4300 static void print_usage PARAMS ((FILE* fp, int exit_value));
4301
4302 #define IS_ALPHA(CHAR)                                                  \
4303   (((CHAR) >= 'a' && (CHAR) <= 'z')                                     \
4304    || ((CHAR) >= 'A' && (CHAR) <= 'Z'))
4305
4306 /* Non-zero if CHAR is a character than can occur in a mangled name.  */
4307 #define is_mangled_char(CHAR)                                           \
4308   (IS_ALPHA (CHAR) || IS_DIGIT (CHAR)                                   \
4309    || (CHAR) == '_' || (CHAR) == '.' || (CHAR) == '$')
4310
4311 /* The name of this program, as invoked.  */
4312 const char* program_name;
4313
4314 /* Prints usage summary to FP and then exits with EXIT_VALUE.  */
4315
4316 static void
4317 print_usage (fp, exit_value)
4318      FILE* fp;
4319      int exit_value;
4320 {
4321   fprintf (fp, "Usage: %s [options] [names ...]\n", program_name);
4322   fprintf (fp, "Options:\n");
4323   fprintf (fp, "  -h,--help       Display this message.\n");
4324   fprintf (fp, "  -p,--no-params  Don't display function parameters\n");
4325   fprintf (fp, "  -v,--verbose    Produce verbose demanglings.\n");
4326   fprintf (fp, "If names are provided, they are demangled.  Otherwise filters standard input.\n");
4327
4328   exit (exit_value);
4329 }
4330
4331 /* Option specification for getopt_long.  */
4332 static const struct option long_options[] = 
4333 {
4334   { "help",      no_argument, NULL, 'h' },
4335   { "no-params", no_argument, NULL, 'p' },
4336   { "verbose",   no_argument, NULL, 'v' },
4337   { NULL,        no_argument, NULL, 0   },
4338 };
4339
4340 /* Main entry for a demangling filter executable.  It will demangle
4341    its command line arguments, if any.  If none are provided, it will
4342    filter stdin to stdout, replacing any recognized mangled C++ names
4343    with their demangled equivalents.  */
4344
4345 int
4346 main (argc, argv)
4347      int argc;
4348      char *argv[];
4349 {
4350   int i;
4351   int opt_char;
4352   int options = DMGL_PARAMS | DMGL_ANSI | DMGL_TYPES;
4353
4354   /* Use the program name of this program, as invoked.  */
4355   program_name = argv[0];
4356
4357   /* Parse options.  */
4358   do 
4359     {
4360       opt_char = getopt_long (argc, argv, "hpv", long_options, NULL);
4361       switch (opt_char)
4362         {
4363         case '?':  /* Unrecognized option.  */
4364           print_usage (stderr, 1);
4365           break;
4366
4367         case 'h':
4368           print_usage (stdout, 0);
4369           break;
4370
4371         case 'p':
4372           options &= ~ DMGL_PARAMS;
4373           break;
4374
4375         case 'v':
4376           options |= DMGL_VERBOSE;
4377           break;
4378         }
4379     }
4380   while (opt_char != -1);
4381
4382   if (optind == argc) 
4383     /* No command line arguments were provided.  Filter stdin.  */
4384     {
4385       dyn_string_t mangled = dyn_string_new (3);
4386       char *s;
4387
4388       /* Read all of input.  */
4389       while (!feof (stdin))
4390         {
4391           char c;
4392
4393           /* Pile characters into mangled until we hit one that can't
4394              occur in a mangled name.  */
4395           c = getchar ();
4396           while (!feof (stdin) && is_mangled_char (c))
4397             {
4398               dyn_string_append_char (mangled, c);
4399               if (feof (stdin))
4400                 break;
4401               c = getchar ();
4402             }
4403
4404           if (dyn_string_length (mangled) > 0)
4405             {
4406 #ifdef IN_GLIBCPP_V3
4407               s = __cxa_demangle (dyn_string_buf (mangled), NULL, NULL, NULL);
4408 #else
4409               s = cplus_demangle_v3 (dyn_string_buf (mangled), options);
4410 #endif
4411
4412               if (s != NULL)
4413                 {
4414                   fputs (s, stdout);
4415                   free (s);
4416                 }
4417               else
4418                 {
4419                   /* It might not have been a mangled name.  Print the
4420                      original text.  */
4421                   fputs (dyn_string_buf (mangled), stdout);
4422                 }
4423
4424               dyn_string_clear (mangled);
4425             }
4426
4427           /* If we haven't hit EOF yet, we've read one character that
4428              can't occur in a mangled name, so print it out.  */
4429           if (!feof (stdin))
4430             putchar (c);
4431         }
4432
4433       dyn_string_delete (mangled);
4434     }
4435   else
4436     /* Demangle command line arguments.  */
4437     {
4438       /* Loop over command line arguments.  */
4439       for (i = optind; i < argc; ++i)
4440         {
4441           char *s;
4442 #ifdef IN_GLIBCPP_V3
4443           int status;
4444 #endif
4445
4446           /* Attempt to demangle.  */
4447 #ifdef IN_GLIBCPP_V3
4448           s = __cxa_demangle (argv[i], NULL, NULL, &status);
4449 #else
4450           s = cplus_demangle_v3 (argv[i], options);
4451 #endif
4452
4453           /* If it worked, print the demangled name.  */
4454           if (s != NULL)
4455             {
4456               printf ("%s\n", s);
4457               free (s);
4458             }
4459           else
4460             {
4461 #ifdef IN_GLIBCPP_V3
4462               fprintf (stderr, "Failed: %s (status %d)\n", argv[i], status);
4463 #else
4464               fprintf (stderr, "Failed: %s\n", argv[i]);
4465 #endif
4466             }
4467         }
4468     }
4469
4470   return 0;
4471 }
4472
4473 #endif /* STANDALONE_DEMANGLER */