Import pre-release gcc-5.0 to new vendor branch
[dragonfly.git] / contrib / gcc-5.0 / libiberty / cp-demangle.c
1 /* Demangler for g++ V3 ABI.
2    Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2014
3    Free Software Foundation, Inc.
4    Written by Ian Lance Taylor <ian@wasabisystems.com>.
5
6    This file is part of the libiberty library, which is part of GCC.
7
8    This file is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2 of the License, or
11    (at your option) any later version.
12
13    In addition to the permissions in the GNU General Public License, the
14    Free Software Foundation gives you unlimited permission to link the
15    compiled version of this file into combinations with other programs,
16    and to distribute those combinations without any restriction coming
17    from the use of this file.  (The General Public License restrictions
18    do apply in other respects; for example, they cover modification of
19    the file, and distribution when not linked into a combined
20    executable.)
21
22    This program is distributed in the hope that it will be useful,
23    but WITHOUT ANY WARRANTY; without even the implied warranty of
24    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
25    GNU General Public License for more details.
26
27    You should have received a copy of the GNU General Public License
28    along with this program; if not, write to the Free Software
29    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. 
30 */
31
32 /* This code implements a demangler for the g++ V3 ABI.  The ABI is
33    described on this web page:
34        http://www.codesourcery.com/cxx-abi/abi.html#mangling
35
36    This code was written while looking at the demangler written by
37    Alex Samuel <samuel@codesourcery.com>.
38
39    This code first pulls the mangled name apart into a list of
40    components, and then walks the list generating the demangled
41    name.
42
43    This file will normally define the following functions, q.v.:
44       char *cplus_demangle_v3(const char *mangled, int options)
45       char *java_demangle_v3(const char *mangled)
46       int cplus_demangle_v3_callback(const char *mangled, int options,
47                                      demangle_callbackref callback)
48       int java_demangle_v3_callback(const char *mangled,
49                                     demangle_callbackref callback)
50       enum gnu_v3_ctor_kinds is_gnu_v3_mangled_ctor (const char *name)
51       enum gnu_v3_dtor_kinds is_gnu_v3_mangled_dtor (const char *name)
52
53    Also, the interface to the component list is public, and defined in
54    demangle.h.  The interface consists of these types, which are
55    defined in demangle.h:
56       enum demangle_component_type
57       struct demangle_component
58       demangle_callbackref
59    and these functions defined in this file:
60       cplus_demangle_fill_name
61       cplus_demangle_fill_extended_operator
62       cplus_demangle_fill_ctor
63       cplus_demangle_fill_dtor
64       cplus_demangle_print
65       cplus_demangle_print_callback
66    and other functions defined in the file cp-demint.c.
67
68    This file also defines some other functions and variables which are
69    only to be used by the file cp-demint.c.
70
71    Preprocessor macros you can define while compiling this file:
72
73    IN_LIBGCC2
74       If defined, this file defines the following functions, q.v.:
75          char *__cxa_demangle (const char *mangled, char *buf, size_t *len,
76                                int *status)
77          int __gcclibcxx_demangle_callback (const char *,
78                                             void (*)
79                                               (const char *, size_t, void *),
80                                             void *)
81       instead of cplus_demangle_v3[_callback]() and
82       java_demangle_v3[_callback]().
83
84    IN_GLIBCPP_V3
85       If defined, this file defines only __cxa_demangle() and
86       __gcclibcxx_demangle_callback(), and no other publically visible
87       functions or variables.
88
89    STANDALONE_DEMANGLER
90       If defined, this file defines a main() function which demangles
91       any arguments, or, if none, demangles stdin.
92
93    CP_DEMANGLE_DEBUG
94       If defined, turns on debugging mode, which prints information on
95       stdout about the mangled string.  This is not generally useful.
96 */
97
98 #if defined (_AIX) && !defined (__GNUC__)
99  #pragma alloca
100 #endif
101
102 #ifdef HAVE_CONFIG_H
103 #include "config.h"
104 #endif
105
106 #include <stdio.h>
107
108 #ifdef HAVE_STDLIB_H
109 #include <stdlib.h>
110 #endif
111 #ifdef HAVE_STRING_H
112 #include <string.h>
113 #endif
114
115 #ifdef HAVE_ALLOCA_H
116 # include <alloca.h>
117 #else
118 # ifndef alloca
119 #  ifdef __GNUC__
120 #   define alloca __builtin_alloca
121 #  else
122 extern char *alloca ();
123 #  endif /* __GNUC__ */
124 # endif /* alloca */
125 #endif /* HAVE_ALLOCA_H */
126
127 #include "ansidecl.h"
128 #include "libiberty.h"
129 #include "demangle.h"
130 #include "cp-demangle.h"
131
132 /* If IN_GLIBCPP_V3 is defined, some functions are made static.  We
133    also rename them via #define to avoid compiler errors when the
134    static definition conflicts with the extern declaration in a header
135    file.  */
136 #ifdef IN_GLIBCPP_V3
137
138 #define CP_STATIC_IF_GLIBCPP_V3 static
139
140 #define cplus_demangle_fill_name d_fill_name
141 static int d_fill_name (struct demangle_component *, const char *, int);
142
143 #define cplus_demangle_fill_extended_operator d_fill_extended_operator
144 static int
145 d_fill_extended_operator (struct demangle_component *, int,
146                           struct demangle_component *);
147
148 #define cplus_demangle_fill_ctor d_fill_ctor
149 static int
150 d_fill_ctor (struct demangle_component *, enum gnu_v3_ctor_kinds,
151              struct demangle_component *);
152
153 #define cplus_demangle_fill_dtor d_fill_dtor
154 static int
155 d_fill_dtor (struct demangle_component *, enum gnu_v3_dtor_kinds,
156              struct demangle_component *);
157
158 #define cplus_demangle_mangled_name d_mangled_name
159 static struct demangle_component *d_mangled_name (struct d_info *, int);
160
161 #define cplus_demangle_type d_type
162 static struct demangle_component *d_type (struct d_info *);
163
164 #define cplus_demangle_print d_print
165 static char *d_print (int, const struct demangle_component *, int, size_t *);
166
167 #define cplus_demangle_print_callback d_print_callback
168 static int d_print_callback (int, const struct demangle_component *,
169                              demangle_callbackref, void *);
170
171 #define cplus_demangle_init_info d_init_info
172 static void d_init_info (const char *, int, size_t, struct d_info *);
173
174 #else /* ! defined(IN_GLIBCPP_V3) */
175 #define CP_STATIC_IF_GLIBCPP_V3
176 #endif /* ! defined(IN_GLIBCPP_V3) */
177
178 /* See if the compiler supports dynamic arrays.  */
179
180 #ifdef __GNUC__
181 #define CP_DYNAMIC_ARRAYS
182 #else
183 #ifdef __STDC__
184 #ifdef __STDC_VERSION__
185 #if __STDC_VERSION__ >= 199901L
186 #define CP_DYNAMIC_ARRAYS
187 #endif /* __STDC__VERSION >= 199901L */
188 #endif /* defined (__STDC_VERSION__) */
189 #endif /* defined (__STDC__) */
190 #endif /* ! defined (__GNUC__) */
191
192 /* We avoid pulling in the ctype tables, to prevent pulling in
193    additional unresolved symbols when this code is used in a library.
194    FIXME: Is this really a valid reason?  This comes from the original
195    V3 demangler code.
196
197    As of this writing this file has the following undefined references
198    when compiled with -DIN_GLIBCPP_V3: realloc, free, memcpy, strcpy,
199    strcat, strlen.  */
200
201 #define IS_DIGIT(c) ((c) >= '0' && (c) <= '9')
202 #define IS_UPPER(c) ((c) >= 'A' && (c) <= 'Z')
203 #define IS_LOWER(c) ((c) >= 'a' && (c) <= 'z')
204
205 /* The prefix prepended by GCC to an identifier represnting the
206    anonymous namespace.  */
207 #define ANONYMOUS_NAMESPACE_PREFIX "_GLOBAL_"
208 #define ANONYMOUS_NAMESPACE_PREFIX_LEN \
209   (sizeof (ANONYMOUS_NAMESPACE_PREFIX) - 1)
210
211 /* Information we keep for the standard substitutions.  */
212
213 struct d_standard_sub_info
214 {
215   /* The code for this substitution.  */
216   char code;
217   /* The simple string it expands to.  */
218   const char *simple_expansion;
219   /* The length of the simple expansion.  */
220   int simple_len;
221   /* The results of a full, verbose, expansion.  This is used when
222      qualifying a constructor/destructor, or when in verbose mode.  */
223   const char *full_expansion;
224   /* The length of the full expansion.  */
225   int full_len;
226   /* What to set the last_name field of d_info to; NULL if we should
227      not set it.  This is only relevant when qualifying a
228      constructor/destructor.  */
229   const char *set_last_name;
230   /* The length of set_last_name.  */
231   int set_last_name_len;
232 };
233
234 /* Accessors for subtrees of struct demangle_component.  */
235
236 #define d_left(dc) ((dc)->u.s_binary.left)
237 #define d_right(dc) ((dc)->u.s_binary.right)
238
239 /* A list of templates.  This is used while printing.  */
240
241 struct d_print_template
242 {
243   /* Next template on the list.  */
244   struct d_print_template *next;
245   /* This template.  */
246   const struct demangle_component *template_decl;
247 };
248
249 /* A list of type modifiers.  This is used while printing.  */
250
251 struct d_print_mod
252 {
253   /* Next modifier on the list.  These are in the reverse of the order
254      in which they appeared in the mangled string.  */
255   struct d_print_mod *next;
256   /* The modifier.  */
257   const struct demangle_component *mod;
258   /* Whether this modifier was printed.  */
259   int printed;
260   /* The list of templates which applies to this modifier.  */
261   struct d_print_template *templates;
262 };
263
264 /* We use these structures to hold information during printing.  */
265
266 struct d_growable_string
267 {
268   /* Buffer holding the result.  */
269   char *buf;
270   /* Current length of data in buffer.  */
271   size_t len;
272   /* Allocated size of buffer.  */
273   size_t alc;
274   /* Set to 1 if we had a memory allocation failure.  */
275   int allocation_failure;
276 };
277
278 /* Stack of components, innermost first, used to avoid loops.  */
279
280 struct d_component_stack
281 {
282   /* This component.  */
283   const struct demangle_component *dc;
284   /* This component's parent.  */
285   const struct d_component_stack *parent;
286 };
287
288 /* A demangle component and some scope captured when it was first
289    traversed.  */
290
291 struct d_saved_scope
292 {
293   /* The component whose scope this is.  */
294   const struct demangle_component *container;
295   /* The list of templates, if any, that was current when this
296      scope was captured.  */
297   struct d_print_template *templates;
298 };
299
300 /* Checkpoint structure to allow backtracking.  This holds copies
301    of the fields of struct d_info that need to be restored
302    if a trial parse needs to be backtracked over.  */
303
304 struct d_info_checkpoint
305 {
306   const char *n;
307   int next_comp;
308   int next_sub;
309   int did_subs;
310   int expansion;
311 };
312
313 enum { D_PRINT_BUFFER_LENGTH = 256 };
314 struct d_print_info
315 {
316   /* Fixed-length allocated buffer for demangled data, flushed to the
317      callback with a NUL termination once full.  */
318   char buf[D_PRINT_BUFFER_LENGTH];
319   /* Current length of data in buffer.  */
320   size_t len;
321   /* The last character printed, saved individually so that it survives
322      any buffer flush.  */
323   char last_char;
324   /* Callback function to handle demangled buffer flush.  */
325   demangle_callbackref callback;
326   /* Opaque callback argument.  */
327   void *opaque;
328   /* The current list of templates, if any.  */
329   struct d_print_template *templates;
330   /* The current list of modifiers (e.g., pointer, reference, etc.),
331      if any.  */
332   struct d_print_mod *modifiers;
333   /* Set to 1 if we saw a demangling error.  */
334   int demangle_failure;
335   /* The current index into any template argument packs we are using
336      for printing.  */
337   int pack_index;
338   /* Number of d_print_flush calls so far.  */
339   unsigned long int flush_count;
340   /* Stack of components, innermost first, used to avoid loops.  */
341   const struct d_component_stack *component_stack;
342   /* Array of saved scopes for evaluating substitutions.  */
343   struct d_saved_scope *saved_scopes;
344   /* Index of the next unused saved scope in the above array.  */
345   int next_saved_scope;
346   /* Number of saved scopes in the above array.  */
347   int num_saved_scopes;
348   /* Array of templates for saving into scopes.  */
349   struct d_print_template *copy_templates;
350   /* Index of the next unused copy template in the above array.  */
351   int next_copy_template;
352   /* Number of copy templates in the above array.  */
353   int num_copy_templates;
354   /* The nearest enclosing template, if any.  */
355   const struct demangle_component *current_template;
356 };
357
358 #ifdef CP_DEMANGLE_DEBUG
359 static void d_dump (struct demangle_component *, int);
360 #endif
361
362 static struct demangle_component *
363 d_make_empty (struct d_info *);
364
365 static struct demangle_component *
366 d_make_comp (struct d_info *, enum demangle_component_type,
367              struct demangle_component *,
368              struct demangle_component *);
369
370 static struct demangle_component *
371 d_make_name (struct d_info *, const char *, int);
372
373 static struct demangle_component *
374 d_make_demangle_mangled_name (struct d_info *, const char *);
375
376 static struct demangle_component *
377 d_make_builtin_type (struct d_info *,
378                      const struct demangle_builtin_type_info *);
379
380 static struct demangle_component *
381 d_make_operator (struct d_info *,
382                  const struct demangle_operator_info *);
383
384 static struct demangle_component *
385 d_make_extended_operator (struct d_info *, int,
386                           struct demangle_component *);
387
388 static struct demangle_component *
389 d_make_ctor (struct d_info *, enum gnu_v3_ctor_kinds,
390              struct demangle_component *);
391
392 static struct demangle_component *
393 d_make_dtor (struct d_info *, enum gnu_v3_dtor_kinds,
394              struct demangle_component *);
395
396 static struct demangle_component *
397 d_make_template_param (struct d_info *, long);
398
399 static struct demangle_component *
400 d_make_sub (struct d_info *, const char *, int);
401
402 static int
403 has_return_type (struct demangle_component *);
404
405 static int
406 is_ctor_dtor_or_conversion (struct demangle_component *);
407
408 static struct demangle_component *d_encoding (struct d_info *, int);
409
410 static struct demangle_component *d_name (struct d_info *);
411
412 static struct demangle_component *d_nested_name (struct d_info *);
413
414 static struct demangle_component *d_prefix (struct d_info *);
415
416 static struct demangle_component *d_unqualified_name (struct d_info *);
417
418 static struct demangle_component *d_source_name (struct d_info *);
419
420 static long d_number (struct d_info *);
421
422 static struct demangle_component *d_identifier (struct d_info *, int);
423
424 static struct demangle_component *d_operator_name (struct d_info *);
425
426 static struct demangle_component *d_special_name (struct d_info *);
427
428 static int d_call_offset (struct d_info *, int);
429
430 static struct demangle_component *d_ctor_dtor_name (struct d_info *);
431
432 static struct demangle_component **
433 d_cv_qualifiers (struct d_info *, struct demangle_component **, int);
434
435 static struct demangle_component *
436 d_ref_qualifier (struct d_info *, struct demangle_component *);
437
438 static struct demangle_component *
439 d_function_type (struct d_info *);
440
441 static struct demangle_component *
442 d_bare_function_type (struct d_info *, int);
443
444 static struct demangle_component *
445 d_class_enum_type (struct d_info *);
446
447 static struct demangle_component *d_array_type (struct d_info *);
448
449 static struct demangle_component *d_vector_type (struct d_info *);
450
451 static struct demangle_component *
452 d_pointer_to_member_type (struct d_info *);
453
454 static struct demangle_component *
455 d_template_param (struct d_info *);
456
457 static struct demangle_component *d_template_args (struct d_info *);
458
459 static struct demangle_component *
460 d_template_arg (struct d_info *);
461
462 static struct demangle_component *d_expression (struct d_info *);
463
464 static struct demangle_component *d_expr_primary (struct d_info *);
465
466 static struct demangle_component *d_local_name (struct d_info *);
467
468 static int d_discriminator (struct d_info *);
469
470 static struct demangle_component *d_lambda (struct d_info *);
471
472 static struct demangle_component *d_unnamed_type (struct d_info *);
473
474 static struct demangle_component *
475 d_clone_suffix (struct d_info *, struct demangle_component *);
476
477 static int
478 d_add_substitution (struct d_info *, struct demangle_component *);
479
480 static struct demangle_component *d_substitution (struct d_info *, int);
481
482 static void d_checkpoint (struct d_info *, struct d_info_checkpoint *);
483
484 static void d_backtrack (struct d_info *, struct d_info_checkpoint *);
485
486 static void d_growable_string_init (struct d_growable_string *, size_t);
487
488 static inline void
489 d_growable_string_resize (struct d_growable_string *, size_t);
490
491 static inline void
492 d_growable_string_append_buffer (struct d_growable_string *,
493                                  const char *, size_t);
494 static void
495 d_growable_string_callback_adapter (const char *, size_t, void *);
496
497 static void
498 d_print_init (struct d_print_info *, demangle_callbackref, void *,
499               const struct demangle_component *);
500
501 static inline void d_print_error (struct d_print_info *);
502
503 static inline int d_print_saw_error (struct d_print_info *);
504
505 static inline void d_print_flush (struct d_print_info *);
506
507 static inline void d_append_char (struct d_print_info *, char);
508
509 static inline void d_append_buffer (struct d_print_info *,
510                                     const char *, size_t);
511
512 static inline void d_append_string (struct d_print_info *, const char *);
513
514 static inline char d_last_char (struct d_print_info *);
515
516 static void
517 d_print_comp (struct d_print_info *, int, const struct demangle_component *);
518
519 static void
520 d_print_java_identifier (struct d_print_info *, const char *, int);
521
522 static void
523 d_print_mod_list (struct d_print_info *, int, struct d_print_mod *, int);
524
525 static void
526 d_print_mod (struct d_print_info *, int, const struct demangle_component *);
527
528 static void
529 d_print_function_type (struct d_print_info *, int,
530                        const struct demangle_component *,
531                        struct d_print_mod *);
532
533 static void
534 d_print_array_type (struct d_print_info *, int,
535                     const struct demangle_component *,
536                     struct d_print_mod *);
537
538 static void
539 d_print_expr_op (struct d_print_info *, int, const struct demangle_component *);
540
541 static void
542 d_print_cast (struct d_print_info *, int, const struct demangle_component *);
543
544 static int d_demangle_callback (const char *, int,
545                                 demangle_callbackref, void *);
546 static char *d_demangle (const char *, int, size_t *);
547
548 #ifdef CP_DEMANGLE_DEBUG
549
550 static void
551 d_dump (struct demangle_component *dc, int indent)
552 {
553   int i;
554
555   if (dc == NULL)
556     {
557       if (indent == 0)
558         printf ("failed demangling\n");
559       return;
560     }
561
562   for (i = 0; i < indent; ++i)
563     putchar (' ');
564
565   switch (dc->type)
566     {
567     case DEMANGLE_COMPONENT_NAME:
568       printf ("name '%.*s'\n", dc->u.s_name.len, dc->u.s_name.s);
569       return;
570     case DEMANGLE_COMPONENT_TAGGED_NAME:
571       printf ("tagged name\n");
572       d_dump (dc->u.s_binary.left, indent + 2);
573       d_dump (dc->u.s_binary.right, indent + 2);
574       return;
575     case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
576       printf ("template parameter %ld\n", dc->u.s_number.number);
577       return;
578     case DEMANGLE_COMPONENT_FUNCTION_PARAM:
579       printf ("function parameter %ld\n", dc->u.s_number.number);
580       return;
581     case DEMANGLE_COMPONENT_CTOR:
582       printf ("constructor %d\n", (int) dc->u.s_ctor.kind);
583       d_dump (dc->u.s_ctor.name, indent + 2);
584       return;
585     case DEMANGLE_COMPONENT_DTOR:
586       printf ("destructor %d\n", (int) dc->u.s_dtor.kind);
587       d_dump (dc->u.s_dtor.name, indent + 2);
588       return;
589     case DEMANGLE_COMPONENT_SUB_STD:
590       printf ("standard substitution %s\n", dc->u.s_string.string);
591       return;
592     case DEMANGLE_COMPONENT_BUILTIN_TYPE:
593       printf ("builtin type %s\n", dc->u.s_builtin.type->name);
594       return;
595     case DEMANGLE_COMPONENT_OPERATOR:
596       printf ("operator %s\n", dc->u.s_operator.op->name);
597       return;
598     case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
599       printf ("extended operator with %d args\n",
600               dc->u.s_extended_operator.args);
601       d_dump (dc->u.s_extended_operator.name, indent + 2);
602       return;
603
604     case DEMANGLE_COMPONENT_QUAL_NAME:
605       printf ("qualified name\n");
606       break;
607     case DEMANGLE_COMPONENT_LOCAL_NAME:
608       printf ("local name\n");
609       break;
610     case DEMANGLE_COMPONENT_TYPED_NAME:
611       printf ("typed name\n");
612       break;
613     case DEMANGLE_COMPONENT_TEMPLATE:
614       printf ("template\n");
615       break;
616     case DEMANGLE_COMPONENT_VTABLE:
617       printf ("vtable\n");
618       break;
619     case DEMANGLE_COMPONENT_VTT:
620       printf ("VTT\n");
621       break;
622     case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
623       printf ("construction vtable\n");
624       break;
625     case DEMANGLE_COMPONENT_TYPEINFO:
626       printf ("typeinfo\n");
627       break;
628     case DEMANGLE_COMPONENT_TYPEINFO_NAME:
629       printf ("typeinfo name\n");
630       break;
631     case DEMANGLE_COMPONENT_TYPEINFO_FN:
632       printf ("typeinfo function\n");
633       break;
634     case DEMANGLE_COMPONENT_THUNK:
635       printf ("thunk\n");
636       break;
637     case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
638       printf ("virtual thunk\n");
639       break;
640     case DEMANGLE_COMPONENT_COVARIANT_THUNK:
641       printf ("covariant thunk\n");
642       break;
643     case DEMANGLE_COMPONENT_JAVA_CLASS:
644       printf ("java class\n");
645       break;
646     case DEMANGLE_COMPONENT_GUARD:
647       printf ("guard\n");
648       break;
649     case DEMANGLE_COMPONENT_REFTEMP:
650       printf ("reference temporary\n");
651       break;
652     case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
653       printf ("hidden alias\n");
654       break;
655     case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
656       printf ("transaction clone\n");
657       break;
658     case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
659       printf ("non-transaction clone\n");
660       break;
661     case DEMANGLE_COMPONENT_RESTRICT:
662       printf ("restrict\n");
663       break;
664     case DEMANGLE_COMPONENT_VOLATILE:
665       printf ("volatile\n");
666       break;
667     case DEMANGLE_COMPONENT_CONST:
668       printf ("const\n");
669       break;
670     case DEMANGLE_COMPONENT_RESTRICT_THIS:
671       printf ("restrict this\n");
672       break;
673     case DEMANGLE_COMPONENT_VOLATILE_THIS:
674       printf ("volatile this\n");
675       break;
676     case DEMANGLE_COMPONENT_CONST_THIS:
677       printf ("const this\n");
678       break;
679     case DEMANGLE_COMPONENT_REFERENCE_THIS:
680       printf ("reference this\n");
681       break;
682     case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
683       printf ("rvalue reference this\n");
684       break;
685     case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
686       printf ("vendor type qualifier\n");
687       break;
688     case DEMANGLE_COMPONENT_POINTER:
689       printf ("pointer\n");
690       break;
691     case DEMANGLE_COMPONENT_REFERENCE:
692       printf ("reference\n");
693       break;
694     case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
695       printf ("rvalue reference\n");
696       break;
697     case DEMANGLE_COMPONENT_COMPLEX:
698       printf ("complex\n");
699       break;
700     case DEMANGLE_COMPONENT_IMAGINARY:
701       printf ("imaginary\n");
702       break;
703     case DEMANGLE_COMPONENT_VENDOR_TYPE:
704       printf ("vendor type\n");
705       break;
706     case DEMANGLE_COMPONENT_FUNCTION_TYPE:
707       printf ("function type\n");
708       break;
709     case DEMANGLE_COMPONENT_ARRAY_TYPE:
710       printf ("array type\n");
711       break;
712     case DEMANGLE_COMPONENT_PTRMEM_TYPE:
713       printf ("pointer to member type\n");
714       break;
715     case DEMANGLE_COMPONENT_FIXED_TYPE:
716       printf ("fixed-point type, accum? %d, sat? %d\n",
717               dc->u.s_fixed.accum, dc->u.s_fixed.sat);
718       d_dump (dc->u.s_fixed.length, indent + 2)
719       break;
720     case DEMANGLE_COMPONENT_ARGLIST:
721       printf ("argument list\n");
722       break;
723     case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
724       printf ("template argument list\n");
725       break;
726     case DEMANGLE_COMPONENT_INITIALIZER_LIST:
727       printf ("initializer list\n");
728       break;
729     case DEMANGLE_COMPONENT_CAST:
730       printf ("cast\n");
731       break;
732     case DEMANGLE_COMPONENT_NULLARY:
733       printf ("nullary operator\n");
734       break;
735     case DEMANGLE_COMPONENT_UNARY:
736       printf ("unary operator\n");
737       break;
738     case DEMANGLE_COMPONENT_BINARY:
739       printf ("binary operator\n");
740       break;
741     case DEMANGLE_COMPONENT_BINARY_ARGS:
742       printf ("binary operator arguments\n");
743       break;
744     case DEMANGLE_COMPONENT_TRINARY:
745       printf ("trinary operator\n");
746       break;
747     case DEMANGLE_COMPONENT_TRINARY_ARG1:
748       printf ("trinary operator arguments 1\n");
749       break;
750     case DEMANGLE_COMPONENT_TRINARY_ARG2:
751       printf ("trinary operator arguments 1\n");
752       break;
753     case DEMANGLE_COMPONENT_LITERAL:
754       printf ("literal\n");
755       break;
756     case DEMANGLE_COMPONENT_LITERAL_NEG:
757       printf ("negative literal\n");
758       break;
759     case DEMANGLE_COMPONENT_JAVA_RESOURCE:
760       printf ("java resource\n");
761       break;
762     case DEMANGLE_COMPONENT_COMPOUND_NAME:
763       printf ("compound name\n");
764       break;
765     case DEMANGLE_COMPONENT_CHARACTER:
766       printf ("character '%c'\n",  dc->u.s_character.character);
767       return;
768     case DEMANGLE_COMPONENT_NUMBER:
769       printf ("number %ld\n", dc->u.s_number.number);
770       return;
771     case DEMANGLE_COMPONENT_DECLTYPE:
772       printf ("decltype\n");
773       break;
774     case DEMANGLE_COMPONENT_PACK_EXPANSION:
775       printf ("pack expansion\n");
776       break;
777     case DEMANGLE_COMPONENT_TLS_INIT:
778       printf ("tls init function\n");
779       break;
780     case DEMANGLE_COMPONENT_TLS_WRAPPER:
781       printf ("tls wrapper function\n");
782       break;
783     case DEMANGLE_COMPONENT_DEFAULT_ARG:
784       printf ("default argument %d\n", dc->u.s_unary_num.num);
785       d_dump (dc->u.s_unary_num.sub, indent+2);
786       return;
787     case DEMANGLE_COMPONENT_LAMBDA:
788       printf ("lambda %d\n", dc->u.s_unary_num.num);
789       d_dump (dc->u.s_unary_num.sub, indent+2);
790       return;
791     }
792
793   d_dump (d_left (dc), indent + 2);
794   d_dump (d_right (dc), indent + 2);
795 }
796
797 #endif /* CP_DEMANGLE_DEBUG */
798
799 /* Fill in a DEMANGLE_COMPONENT_NAME.  */
800
801 CP_STATIC_IF_GLIBCPP_V3
802 int
803 cplus_demangle_fill_name (struct demangle_component *p, const char *s, int len)
804 {
805   if (p == NULL || s == NULL || len == 0)
806     return 0;
807   p->type = DEMANGLE_COMPONENT_NAME;
808   p->u.s_name.s = s;
809   p->u.s_name.len = len;
810   return 1;
811 }
812
813 /* Fill in a DEMANGLE_COMPONENT_EXTENDED_OPERATOR.  */
814
815 CP_STATIC_IF_GLIBCPP_V3
816 int
817 cplus_demangle_fill_extended_operator (struct demangle_component *p, int args,
818                                        struct demangle_component *name)
819 {
820   if (p == NULL || args < 0 || name == NULL)
821     return 0;
822   p->type = DEMANGLE_COMPONENT_EXTENDED_OPERATOR;
823   p->u.s_extended_operator.args = args;
824   p->u.s_extended_operator.name = name;
825   return 1;
826 }
827
828 /* Fill in a DEMANGLE_COMPONENT_CTOR.  */
829
830 CP_STATIC_IF_GLIBCPP_V3
831 int
832 cplus_demangle_fill_ctor (struct demangle_component *p,
833                           enum gnu_v3_ctor_kinds kind,
834                           struct demangle_component *name)
835 {
836   if (p == NULL
837       || name == NULL
838       || (int) kind < gnu_v3_complete_object_ctor
839       || (int) kind > gnu_v3_object_ctor_group)
840     return 0;
841   p->type = DEMANGLE_COMPONENT_CTOR;
842   p->u.s_ctor.kind = kind;
843   p->u.s_ctor.name = name;
844   return 1;
845 }
846
847 /* Fill in a DEMANGLE_COMPONENT_DTOR.  */
848
849 CP_STATIC_IF_GLIBCPP_V3
850 int
851 cplus_demangle_fill_dtor (struct demangle_component *p,
852                           enum gnu_v3_dtor_kinds kind,
853                           struct demangle_component *name)
854 {
855   if (p == NULL
856       || name == NULL
857       || (int) kind < gnu_v3_deleting_dtor
858       || (int) kind > gnu_v3_object_dtor_group)
859     return 0;
860   p->type = DEMANGLE_COMPONENT_DTOR;
861   p->u.s_dtor.kind = kind;
862   p->u.s_dtor.name = name;
863   return 1;
864 }
865
866 /* Add a new component.  */
867
868 static struct demangle_component *
869 d_make_empty (struct d_info *di)
870 {
871   struct demangle_component *p;
872
873   if (di->next_comp >= di->num_comps)
874     return NULL;
875   p = &di->comps[di->next_comp];
876   ++di->next_comp;
877   return p;
878 }
879
880 /* Add a new generic component.  */
881
882 static struct demangle_component *
883 d_make_comp (struct d_info *di, enum demangle_component_type type,
884              struct demangle_component *left,
885              struct demangle_component *right)
886 {
887   struct demangle_component *p;
888
889   /* We check for errors here.  A typical error would be a NULL return
890      from a subroutine.  We catch those here, and return NULL
891      upward.  */
892   switch (type)
893     {
894       /* These types require two parameters.  */
895     case DEMANGLE_COMPONENT_QUAL_NAME:
896     case DEMANGLE_COMPONENT_LOCAL_NAME:
897     case DEMANGLE_COMPONENT_TYPED_NAME:
898     case DEMANGLE_COMPONENT_TAGGED_NAME:
899     case DEMANGLE_COMPONENT_TEMPLATE:
900     case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
901     case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
902     case DEMANGLE_COMPONENT_PTRMEM_TYPE:
903     case DEMANGLE_COMPONENT_UNARY:
904     case DEMANGLE_COMPONENT_BINARY:
905     case DEMANGLE_COMPONENT_BINARY_ARGS:
906     case DEMANGLE_COMPONENT_TRINARY:
907     case DEMANGLE_COMPONENT_TRINARY_ARG1:
908     case DEMANGLE_COMPONENT_LITERAL:
909     case DEMANGLE_COMPONENT_LITERAL_NEG:
910     case DEMANGLE_COMPONENT_COMPOUND_NAME:
911     case DEMANGLE_COMPONENT_VECTOR_TYPE:
912     case DEMANGLE_COMPONENT_CLONE:
913       if (left == NULL || right == NULL)
914         return NULL;
915       break;
916
917       /* These types only require one parameter.  */
918     case DEMANGLE_COMPONENT_VTABLE:
919     case DEMANGLE_COMPONENT_VTT:
920     case DEMANGLE_COMPONENT_TYPEINFO:
921     case DEMANGLE_COMPONENT_TYPEINFO_NAME:
922     case DEMANGLE_COMPONENT_TYPEINFO_FN:
923     case DEMANGLE_COMPONENT_THUNK:
924     case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
925     case DEMANGLE_COMPONENT_COVARIANT_THUNK:
926     case DEMANGLE_COMPONENT_JAVA_CLASS:
927     case DEMANGLE_COMPONENT_GUARD:
928     case DEMANGLE_COMPONENT_TLS_INIT:
929     case DEMANGLE_COMPONENT_TLS_WRAPPER:
930     case DEMANGLE_COMPONENT_REFTEMP:
931     case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
932     case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
933     case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
934     case DEMANGLE_COMPONENT_POINTER:
935     case DEMANGLE_COMPONENT_REFERENCE:
936     case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
937     case DEMANGLE_COMPONENT_COMPLEX:
938     case DEMANGLE_COMPONENT_IMAGINARY:
939     case DEMANGLE_COMPONENT_VENDOR_TYPE:
940     case DEMANGLE_COMPONENT_CAST:
941     case DEMANGLE_COMPONENT_JAVA_RESOURCE:
942     case DEMANGLE_COMPONENT_DECLTYPE:
943     case DEMANGLE_COMPONENT_PACK_EXPANSION:
944     case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
945     case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
946     case DEMANGLE_COMPONENT_NULLARY:
947     case DEMANGLE_COMPONENT_TRINARY_ARG2:
948       if (left == NULL)
949         return NULL;
950       break;
951
952       /* This needs a right parameter, but the left parameter can be
953          empty.  */
954     case DEMANGLE_COMPONENT_ARRAY_TYPE:
955     case DEMANGLE_COMPONENT_INITIALIZER_LIST:
956       if (right == NULL)
957         return NULL;
958       break;
959
960       /* These are allowed to have no parameters--in some cases they
961          will be filled in later.  */
962     case DEMANGLE_COMPONENT_FUNCTION_TYPE:
963     case DEMANGLE_COMPONENT_RESTRICT:
964     case DEMANGLE_COMPONENT_VOLATILE:
965     case DEMANGLE_COMPONENT_CONST:
966     case DEMANGLE_COMPONENT_RESTRICT_THIS:
967     case DEMANGLE_COMPONENT_VOLATILE_THIS:
968     case DEMANGLE_COMPONENT_CONST_THIS:
969     case DEMANGLE_COMPONENT_REFERENCE_THIS:
970     case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
971     case DEMANGLE_COMPONENT_ARGLIST:
972     case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
973       break;
974
975       /* Other types should not be seen here.  */
976     default:
977       return NULL;
978     }
979
980   p = d_make_empty (di);
981   if (p != NULL)
982     {
983       p->type = type;
984       p->u.s_binary.left = left;
985       p->u.s_binary.right = right;
986     }
987   return p;
988 }
989
990 /* Add a new demangle mangled name component.  */
991
992 static struct demangle_component *
993 d_make_demangle_mangled_name (struct d_info *di, const char *s)
994 {
995   if (d_peek_char (di) != '_' || d_peek_next_char (di) != 'Z')
996     return d_make_name (di, s, strlen (s));
997   d_advance (di, 2);
998   return d_encoding (di, 0);
999 }
1000
1001 /* Add a new name component.  */
1002
1003 static struct demangle_component *
1004 d_make_name (struct d_info *di, const char *s, int len)
1005 {
1006   struct demangle_component *p;
1007
1008   p = d_make_empty (di);
1009   if (! cplus_demangle_fill_name (p, s, len))
1010     return NULL;
1011   return p;
1012 }
1013
1014 /* Add a new builtin type component.  */
1015
1016 static struct demangle_component *
1017 d_make_builtin_type (struct d_info *di,
1018                      const struct demangle_builtin_type_info *type)
1019 {
1020   struct demangle_component *p;
1021
1022   if (type == NULL)
1023     return NULL;
1024   p = d_make_empty (di);
1025   if (p != NULL)
1026     {
1027       p->type = DEMANGLE_COMPONENT_BUILTIN_TYPE;
1028       p->u.s_builtin.type = type;
1029     }
1030   return p;
1031 }
1032
1033 /* Add a new operator component.  */
1034
1035 static struct demangle_component *
1036 d_make_operator (struct d_info *di, const struct demangle_operator_info *op)
1037 {
1038   struct demangle_component *p;
1039
1040   p = d_make_empty (di);
1041   if (p != NULL)
1042     {
1043       p->type = DEMANGLE_COMPONENT_OPERATOR;
1044       p->u.s_operator.op = op;
1045     }
1046   return p;
1047 }
1048
1049 /* Add a new extended operator component.  */
1050
1051 static struct demangle_component *
1052 d_make_extended_operator (struct d_info *di, int args,
1053                           struct demangle_component *name)
1054 {
1055   struct demangle_component *p;
1056
1057   p = d_make_empty (di);
1058   if (! cplus_demangle_fill_extended_operator (p, args, name))
1059     return NULL;
1060   return p;
1061 }
1062
1063 static struct demangle_component *
1064 d_make_default_arg (struct d_info *di, int num,
1065                     struct demangle_component *sub)
1066 {
1067   struct demangle_component *p = d_make_empty (di);
1068   if (p)
1069     {
1070       p->type = DEMANGLE_COMPONENT_DEFAULT_ARG;
1071       p->u.s_unary_num.num = num;
1072       p->u.s_unary_num.sub = sub;
1073     }
1074   return p;
1075 }
1076
1077 /* Add a new constructor component.  */
1078
1079 static struct demangle_component *
1080 d_make_ctor (struct d_info *di, enum gnu_v3_ctor_kinds kind,
1081              struct demangle_component *name)
1082 {
1083   struct demangle_component *p;
1084
1085   p = d_make_empty (di);
1086   if (! cplus_demangle_fill_ctor (p, kind, name))
1087     return NULL;
1088   return p;
1089 }
1090
1091 /* Add a new destructor component.  */
1092
1093 static struct demangle_component *
1094 d_make_dtor (struct d_info *di, enum gnu_v3_dtor_kinds kind,
1095              struct demangle_component *name)
1096 {
1097   struct demangle_component *p;
1098
1099   p = d_make_empty (di);
1100   if (! cplus_demangle_fill_dtor (p, kind, name))
1101     return NULL;
1102   return p;
1103 }
1104
1105 /* Add a new template parameter.  */
1106
1107 static struct demangle_component *
1108 d_make_template_param (struct d_info *di, long i)
1109 {
1110   struct demangle_component *p;
1111
1112   p = d_make_empty (di);
1113   if (p != NULL)
1114     {
1115       p->type = DEMANGLE_COMPONENT_TEMPLATE_PARAM;
1116       p->u.s_number.number = i;
1117     }
1118   return p;
1119 }
1120
1121 /* Add a new function parameter.  */
1122
1123 static struct demangle_component *
1124 d_make_function_param (struct d_info *di, long i)
1125 {
1126   struct demangle_component *p;
1127
1128   p = d_make_empty (di);
1129   if (p != NULL)
1130     {
1131       p->type = DEMANGLE_COMPONENT_FUNCTION_PARAM;
1132       p->u.s_number.number = i;
1133     }
1134   return p;
1135 }
1136
1137 /* Add a new standard substitution component.  */
1138
1139 static struct demangle_component *
1140 d_make_sub (struct d_info *di, const char *name, int len)
1141 {
1142   struct demangle_component *p;
1143
1144   p = d_make_empty (di);
1145   if (p != NULL)
1146     {
1147       p->type = DEMANGLE_COMPONENT_SUB_STD;
1148       p->u.s_string.string = name;
1149       p->u.s_string.len = len;
1150     }
1151   return p;
1152 }
1153
1154 /* <mangled-name> ::= _Z <encoding> [<clone-suffix>]*
1155
1156    TOP_LEVEL is non-zero when called at the top level.  */
1157
1158 CP_STATIC_IF_GLIBCPP_V3
1159 struct demangle_component *
1160 cplus_demangle_mangled_name (struct d_info *di, int top_level)
1161 {
1162   struct demangle_component *p;
1163
1164   if (! d_check_char (di, '_')
1165       /* Allow missing _ if not at toplevel to work around a
1166          bug in G++ abi-version=2 mangling; see the comment in
1167          write_template_arg.  */
1168       && top_level)
1169     return NULL;
1170   if (! d_check_char (di, 'Z'))
1171     return NULL;
1172   p = d_encoding (di, top_level);
1173
1174   /* If at top level and parsing parameters, check for a clone
1175      suffix.  */
1176   if (top_level && (di->options & DMGL_PARAMS) != 0)
1177     while (d_peek_char (di) == '.'
1178            && (IS_LOWER (d_peek_next_char (di))
1179                || d_peek_next_char (di) == '_'
1180                || IS_DIGIT (d_peek_next_char (di))))
1181       p = d_clone_suffix (di, p);
1182
1183   return p;
1184 }
1185
1186 /* Return whether a function should have a return type.  The argument
1187    is the function name, which may be qualified in various ways.  The
1188    rules are that template functions have return types with some
1189    exceptions, function types which are not part of a function name
1190    mangling have return types with some exceptions, and non-template
1191    function names do not have return types.  The exceptions are that
1192    constructors, destructors, and conversion operators do not have
1193    return types.  */
1194
1195 static int
1196 has_return_type (struct demangle_component *dc)
1197 {
1198   if (dc == NULL)
1199     return 0;
1200   switch (dc->type)
1201     {
1202     default:
1203       return 0;
1204     case DEMANGLE_COMPONENT_TEMPLATE:
1205       return ! is_ctor_dtor_or_conversion (d_left (dc));
1206     case DEMANGLE_COMPONENT_RESTRICT_THIS:
1207     case DEMANGLE_COMPONENT_VOLATILE_THIS:
1208     case DEMANGLE_COMPONENT_CONST_THIS:
1209     case DEMANGLE_COMPONENT_REFERENCE_THIS:
1210     case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
1211       return has_return_type (d_left (dc));
1212     }
1213 }
1214
1215 /* Return whether a name is a constructor, a destructor, or a
1216    conversion operator.  */
1217
1218 static int
1219 is_ctor_dtor_or_conversion (struct demangle_component *dc)
1220 {
1221   if (dc == NULL)
1222     return 0;
1223   switch (dc->type)
1224     {
1225     default:
1226       return 0;
1227     case DEMANGLE_COMPONENT_QUAL_NAME:
1228     case DEMANGLE_COMPONENT_LOCAL_NAME:
1229       return is_ctor_dtor_or_conversion (d_right (dc));
1230     case DEMANGLE_COMPONENT_CTOR:
1231     case DEMANGLE_COMPONENT_DTOR:
1232     case DEMANGLE_COMPONENT_CAST:
1233       return 1;
1234     }
1235 }
1236
1237 /* <encoding> ::= <(function) name> <bare-function-type>
1238               ::= <(data) name>
1239               ::= <special-name>
1240
1241    TOP_LEVEL is non-zero when called at the top level, in which case
1242    if DMGL_PARAMS is not set we do not demangle the function
1243    parameters.  We only set this at the top level, because otherwise
1244    we would not correctly demangle names in local scopes.  */
1245
1246 static struct demangle_component *
1247 d_encoding (struct d_info *di, int top_level)
1248 {
1249   char peek = d_peek_char (di);
1250
1251   if (peek == 'G' || peek == 'T')
1252     return d_special_name (di);
1253   else
1254     {
1255       struct demangle_component *dc;
1256
1257       dc = d_name (di);
1258
1259       if (dc != NULL && top_level && (di->options & DMGL_PARAMS) == 0)
1260         {
1261           /* Strip off any initial CV-qualifiers, as they really apply
1262              to the `this' parameter, and they were not output by the
1263              v2 demangler without DMGL_PARAMS.  */
1264           while (dc->type == DEMANGLE_COMPONENT_RESTRICT_THIS
1265                  || dc->type == DEMANGLE_COMPONENT_VOLATILE_THIS
1266                  || dc->type == DEMANGLE_COMPONENT_CONST_THIS
1267                  || dc->type == DEMANGLE_COMPONENT_REFERENCE_THIS
1268                  || dc->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS)
1269             dc = d_left (dc);
1270
1271           /* If the top level is a DEMANGLE_COMPONENT_LOCAL_NAME, then
1272              there may be CV-qualifiers on its right argument which
1273              really apply here; this happens when parsing a class
1274              which is local to a function.  */
1275           if (dc->type == DEMANGLE_COMPONENT_LOCAL_NAME)
1276             {
1277               struct demangle_component *dcr;
1278
1279               dcr = d_right (dc);
1280               while (dcr->type == DEMANGLE_COMPONENT_RESTRICT_THIS
1281                      || dcr->type == DEMANGLE_COMPONENT_VOLATILE_THIS
1282                      || dcr->type == DEMANGLE_COMPONENT_CONST_THIS
1283                      || dcr->type == DEMANGLE_COMPONENT_REFERENCE_THIS
1284                      || dcr->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS)
1285                 dcr = d_left (dcr);
1286               dc->u.s_binary.right = dcr;
1287             }
1288
1289           return dc;
1290         }
1291
1292       peek = d_peek_char (di);
1293       if (dc == NULL || peek == '\0' || peek == 'E')
1294         return dc;
1295       return d_make_comp (di, DEMANGLE_COMPONENT_TYPED_NAME, dc,
1296                           d_bare_function_type (di, has_return_type (dc)));
1297     }
1298 }
1299
1300 /* <tagged-name> ::= <name> B <source-name> */
1301
1302 static struct demangle_component *
1303 d_abi_tags (struct d_info *di, struct demangle_component *dc)
1304 {
1305   char peek;
1306   while (peek = d_peek_char (di),
1307          peek == 'B')
1308     {
1309       struct demangle_component *tag;
1310       d_advance (di, 1);
1311       tag = d_source_name (di);
1312       dc = d_make_comp (di, DEMANGLE_COMPONENT_TAGGED_NAME, dc, tag);
1313     }
1314   return dc;
1315 }
1316
1317 /* <name> ::= <nested-name>
1318           ::= <unscoped-name>
1319           ::= <unscoped-template-name> <template-args>
1320           ::= <local-name>
1321
1322    <unscoped-name> ::= <unqualified-name>
1323                    ::= St <unqualified-name>
1324
1325    <unscoped-template-name> ::= <unscoped-name>
1326                             ::= <substitution>
1327 */
1328
1329 static struct demangle_component *
1330 d_name (struct d_info *di)
1331 {
1332   char peek = d_peek_char (di);
1333   struct demangle_component *dc;
1334
1335   switch (peek)
1336     {
1337     case 'N':
1338       return d_nested_name (di);
1339
1340     case 'Z':
1341       return d_local_name (di);
1342
1343     case 'U':
1344       return d_unqualified_name (di);
1345
1346     case 'S':
1347       {
1348         int subst;
1349
1350         if (d_peek_next_char (di) != 't')
1351           {
1352             dc = d_substitution (di, 0);
1353             subst = 1;
1354           }
1355         else
1356           {
1357             d_advance (di, 2);
1358             dc = d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME,
1359                               d_make_name (di, "std", 3),
1360                               d_unqualified_name (di));
1361             di->expansion += 3;
1362             subst = 0;
1363           }
1364
1365         if (d_peek_char (di) != 'I')
1366           {
1367             /* The grammar does not permit this case to occur if we
1368                called d_substitution() above (i.e., subst == 1).  We
1369                don't bother to check.  */
1370           }
1371         else
1372           {
1373             /* This is <template-args>, which means that we just saw
1374                <unscoped-template-name>, which is a substitution
1375                candidate if we didn't just get it from a
1376                substitution.  */
1377             if (! subst)
1378               {
1379                 if (! d_add_substitution (di, dc))
1380                   return NULL;
1381               }
1382             dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc,
1383                               d_template_args (di));
1384           }
1385
1386         return dc;
1387       }
1388
1389     case 'L':
1390     default:
1391       dc = d_unqualified_name (di);
1392       if (d_peek_char (di) == 'I')
1393         {
1394           /* This is <template-args>, which means that we just saw
1395              <unscoped-template-name>, which is a substitution
1396              candidate.  */
1397           if (! d_add_substitution (di, dc))
1398             return NULL;
1399           dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc,
1400                             d_template_args (di));
1401         }
1402       return dc;
1403     }
1404 }
1405
1406 /* <nested-name> ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E
1407                  ::= N [<CV-qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E
1408 */
1409
1410 static struct demangle_component *
1411 d_nested_name (struct d_info *di)
1412 {
1413   struct demangle_component *ret;
1414   struct demangle_component **pret;
1415   struct demangle_component *rqual;
1416
1417   if (! d_check_char (di, 'N'))
1418     return NULL;
1419
1420   pret = d_cv_qualifiers (di, &ret, 1);
1421   if (pret == NULL)
1422     return NULL;
1423
1424   /* Parse the ref-qualifier now and then attach it
1425      once we have something to attach it to.  */
1426   rqual = d_ref_qualifier (di, NULL);
1427
1428   *pret = d_prefix (di);
1429   if (*pret == NULL)
1430     return NULL;
1431
1432   if (rqual)
1433     {
1434       d_left (rqual) = ret;
1435       ret = rqual;
1436     }
1437
1438   if (! d_check_char (di, 'E'))
1439     return NULL;
1440
1441   return ret;
1442 }
1443
1444 /* <prefix> ::= <prefix> <unqualified-name>
1445             ::= <template-prefix> <template-args>
1446             ::= <template-param>
1447             ::= <decltype>
1448             ::=
1449             ::= <substitution>
1450
1451    <template-prefix> ::= <prefix> <(template) unqualified-name>
1452                      ::= <template-param>
1453                      ::= <substitution>
1454 */
1455
1456 static struct demangle_component *
1457 d_prefix (struct d_info *di)
1458 {
1459   struct demangle_component *ret = NULL;
1460
1461   while (1)
1462     {
1463       char peek;
1464       enum demangle_component_type comb_type;
1465       struct demangle_component *dc;
1466
1467       peek = d_peek_char (di);
1468       if (peek == '\0')
1469         return NULL;
1470
1471       /* The older code accepts a <local-name> here, but I don't see
1472          that in the grammar.  The older code does not accept a
1473          <template-param> here.  */
1474
1475       comb_type = DEMANGLE_COMPONENT_QUAL_NAME;
1476       if (peek == 'D')
1477         {
1478           char peek2 = d_peek_next_char (di);
1479           if (peek2 == 'T' || peek2 == 't')
1480             /* Decltype.  */
1481             dc = cplus_demangle_type (di);
1482           else
1483             /* Destructor name.  */
1484             dc = d_unqualified_name (di);
1485         }
1486       else if (IS_DIGIT (peek)
1487           || IS_LOWER (peek)
1488           || peek == 'C'
1489           || peek == 'U'
1490           || peek == 'L')
1491         dc = d_unqualified_name (di);
1492       else if (peek == 'S')
1493         dc = d_substitution (di, 1);
1494       else if (peek == 'I')
1495         {
1496           if (ret == NULL)
1497             return NULL;
1498           comb_type = DEMANGLE_COMPONENT_TEMPLATE;
1499           dc = d_template_args (di);
1500         }
1501       else if (peek == 'T')
1502         dc = d_template_param (di);
1503       else if (peek == 'E')
1504         return ret;
1505       else if (peek == 'M')
1506         {
1507           /* Initializer scope for a lambda.  We don't need to represent
1508              this; the normal code will just treat the variable as a type
1509              scope, which gives appropriate output.  */
1510           if (ret == NULL)
1511             return NULL;
1512           d_advance (di, 1);
1513           continue;
1514         }
1515       else
1516         return NULL;
1517
1518       if (ret == NULL)
1519         ret = dc;
1520       else
1521         ret = d_make_comp (di, comb_type, ret, dc);
1522
1523       if (peek != 'S' && d_peek_char (di) != 'E')
1524         {
1525           if (! d_add_substitution (di, ret))
1526             return NULL;
1527         }
1528     }
1529 }
1530
1531 /* <unqualified-name> ::= <operator-name>
1532                       ::= <ctor-dtor-name>
1533                       ::= <source-name>
1534                       ::= <local-source-name> 
1535
1536     <local-source-name> ::= L <source-name> <discriminator>
1537 */
1538
1539 static struct demangle_component *
1540 d_unqualified_name (struct d_info *di)
1541 {
1542   struct demangle_component *ret;
1543   char peek;
1544
1545   peek = d_peek_char (di);
1546   if (IS_DIGIT (peek))
1547     ret = d_source_name (di);
1548   else if (IS_LOWER (peek))
1549     {
1550       ret = d_operator_name (di);
1551       if (ret != NULL && ret->type == DEMANGLE_COMPONENT_OPERATOR)
1552         {
1553           di->expansion += sizeof "operator" + ret->u.s_operator.op->len - 2;
1554           if (!strcmp (ret->u.s_operator.op->code, "li"))
1555             ret = d_make_comp (di, DEMANGLE_COMPONENT_UNARY, ret,
1556                                d_source_name (di));
1557         }
1558     }
1559   else if (peek == 'C' || peek == 'D')
1560     ret = d_ctor_dtor_name (di);
1561   else if (peek == 'L')
1562     {
1563       d_advance (di, 1);
1564
1565       ret = d_source_name (di);
1566       if (ret == NULL)
1567         return NULL;
1568       if (! d_discriminator (di))
1569         return NULL;
1570     }
1571   else if (peek == 'U')
1572     {
1573       switch (d_peek_next_char (di))
1574         {
1575         case 'l':
1576           ret = d_lambda (di);
1577           break;
1578         case 't':
1579           ret = d_unnamed_type (di);
1580           break;
1581         default:
1582           return NULL;
1583         }
1584     }
1585   else
1586     return NULL;
1587
1588   if (d_peek_char (di) == 'B')
1589     ret = d_abi_tags (di, ret);
1590   return ret;
1591 }
1592
1593 /* <source-name> ::= <(positive length) number> <identifier>  */
1594
1595 static struct demangle_component *
1596 d_source_name (struct d_info *di)
1597 {
1598   long len;
1599   struct demangle_component *ret;
1600
1601   len = d_number (di);
1602   if (len <= 0)
1603     return NULL;
1604   ret = d_identifier (di, len);
1605   di->last_name = ret;
1606   return ret;
1607 }
1608
1609 /* number ::= [n] <(non-negative decimal integer)>  */
1610
1611 static long
1612 d_number (struct d_info *di)
1613 {
1614   int negative;
1615   char peek;
1616   long ret;
1617
1618   negative = 0;
1619   peek = d_peek_char (di);
1620   if (peek == 'n')
1621     {
1622       negative = 1;
1623       d_advance (di, 1);
1624       peek = d_peek_char (di);
1625     }
1626
1627   ret = 0;
1628   while (1)
1629     {
1630       if (! IS_DIGIT (peek))
1631         {
1632           if (negative)
1633             ret = - ret;
1634           return ret;
1635         }
1636       ret = ret * 10 + peek - '0';
1637       d_advance (di, 1);
1638       peek = d_peek_char (di);
1639     }
1640 }
1641
1642 /* Like d_number, but returns a demangle_component.  */
1643
1644 static struct demangle_component *
1645 d_number_component (struct d_info *di)
1646 {
1647   struct demangle_component *ret = d_make_empty (di);
1648   if (ret)
1649     {
1650       ret->type = DEMANGLE_COMPONENT_NUMBER;
1651       ret->u.s_number.number = d_number (di);
1652     }
1653   return ret;
1654 }
1655
1656 /* identifier ::= <(unqualified source code identifier)>  */
1657
1658 static struct demangle_component *
1659 d_identifier (struct d_info *di, int len)
1660 {
1661   const char *name;
1662
1663   name = d_str (di);
1664
1665   if (di->send - name < len)
1666     return NULL;
1667
1668   d_advance (di, len);
1669
1670   /* A Java mangled name may have a trailing '$' if it is a C++
1671      keyword.  This '$' is not included in the length count.  We just
1672      ignore the '$'.  */
1673   if ((di->options & DMGL_JAVA) != 0
1674       && d_peek_char (di) == '$')
1675     d_advance (di, 1);
1676
1677   /* Look for something which looks like a gcc encoding of an
1678      anonymous namespace, and replace it with a more user friendly
1679      name.  */
1680   if (len >= (int) ANONYMOUS_NAMESPACE_PREFIX_LEN + 2
1681       && memcmp (name, ANONYMOUS_NAMESPACE_PREFIX,
1682                  ANONYMOUS_NAMESPACE_PREFIX_LEN) == 0)
1683     {
1684       const char *s;
1685
1686       s = name + ANONYMOUS_NAMESPACE_PREFIX_LEN;
1687       if ((*s == '.' || *s == '_' || *s == '$')
1688           && s[1] == 'N')
1689         {
1690           di->expansion -= len - sizeof "(anonymous namespace)";
1691           return d_make_name (di, "(anonymous namespace)",
1692                               sizeof "(anonymous namespace)" - 1);
1693         }
1694     }
1695
1696   return d_make_name (di, name, len);
1697 }
1698
1699 /* operator_name ::= many different two character encodings.
1700                  ::= cv <type>
1701                  ::= v <digit> <source-name>
1702
1703    This list is sorted for binary search.  */
1704
1705 #define NL(s) s, (sizeof s) - 1
1706
1707 CP_STATIC_IF_GLIBCPP_V3
1708 const struct demangle_operator_info cplus_demangle_operators[] =
1709 {
1710   { "aN", NL ("&="),        2 },
1711   { "aS", NL ("="),         2 },
1712   { "aa", NL ("&&"),        2 },
1713   { "ad", NL ("&"),         1 },
1714   { "an", NL ("&"),         2 },
1715   { "at", NL ("alignof "),   1 },
1716   { "az", NL ("alignof "),   1 },
1717   { "cc", NL ("const_cast"), 2 },
1718   { "cl", NL ("()"),        2 },
1719   { "cm", NL (","),         2 },
1720   { "co", NL ("~"),         1 },
1721   { "dV", NL ("/="),        2 },
1722   { "da", NL ("delete[] "), 1 },
1723   { "dc", NL ("dynamic_cast"), 2 },
1724   { "de", NL ("*"),         1 },
1725   { "dl", NL ("delete "),   1 },
1726   { "ds", NL (".*"),        2 },
1727   { "dt", NL ("."),         2 },
1728   { "dv", NL ("/"),         2 },
1729   { "eO", NL ("^="),        2 },
1730   { "eo", NL ("^"),         2 },
1731   { "eq", NL ("=="),        2 },
1732   { "ge", NL (">="),        2 },
1733   { "gs", NL ("::"),        1 },
1734   { "gt", NL (">"),         2 },
1735   { "ix", NL ("[]"),        2 },
1736   { "lS", NL ("<<="),       2 },
1737   { "le", NL ("<="),        2 },
1738   { "li", NL ("operator\"\" "), 1 },
1739   { "ls", NL ("<<"),        2 },
1740   { "lt", NL ("<"),         2 },
1741   { "mI", NL ("-="),        2 },
1742   { "mL", NL ("*="),        2 },
1743   { "mi", NL ("-"),         2 },
1744   { "ml", NL ("*"),         2 },
1745   { "mm", NL ("--"),        1 },
1746   { "na", NL ("new[]"),     3 },
1747   { "ne", NL ("!="),        2 },
1748   { "ng", NL ("-"),         1 },
1749   { "nt", NL ("!"),         1 },
1750   { "nw", NL ("new"),       3 },
1751   { "oR", NL ("|="),        2 },
1752   { "oo", NL ("||"),        2 },
1753   { "or", NL ("|"),         2 },
1754   { "pL", NL ("+="),        2 },
1755   { "pl", NL ("+"),         2 },
1756   { "pm", NL ("->*"),       2 },
1757   { "pp", NL ("++"),        1 },
1758   { "ps", NL ("+"),         1 },
1759   { "pt", NL ("->"),        2 },
1760   { "qu", NL ("?"),         3 },
1761   { "rM", NL ("%="),        2 },
1762   { "rS", NL (">>="),       2 },
1763   { "rc", NL ("reinterpret_cast"), 2 },
1764   { "rm", NL ("%"),         2 },
1765   { "rs", NL (">>"),        2 },
1766   { "sc", NL ("static_cast"), 2 },
1767   { "st", NL ("sizeof "),   1 },
1768   { "sz", NL ("sizeof "),   1 },
1769   { "tr", NL ("throw"),     0 },
1770   { "tw", NL ("throw "),    1 },
1771   { NULL, NULL, 0,          0 }
1772 };
1773
1774 static struct demangle_component *
1775 d_operator_name (struct d_info *di)
1776 {
1777   char c1;
1778   char c2;
1779
1780   c1 = d_next_char (di);
1781   c2 = d_next_char (di);
1782   if (c1 == 'v' && IS_DIGIT (c2))
1783     return d_make_extended_operator (di, c2 - '0', d_source_name (di));
1784   else if (c1 == 'c' && c2 == 'v')
1785     {
1786       struct demangle_component *type;
1787       int was_conversion = di->is_conversion;
1788
1789       di->is_conversion = ! di->is_expression;
1790       type = cplus_demangle_type (di);
1791       di->is_conversion = was_conversion;
1792       return d_make_comp (di, DEMANGLE_COMPONENT_CAST, type, NULL);
1793     }
1794   else
1795     {
1796       /* LOW is the inclusive lower bound.  */
1797       int low = 0;
1798       /* HIGH is the exclusive upper bound.  We subtract one to ignore
1799          the sentinel at the end of the array.  */
1800       int high = ((sizeof (cplus_demangle_operators)
1801                    / sizeof (cplus_demangle_operators[0]))
1802                   - 1);
1803
1804       while (1)
1805         {
1806           int i;
1807           const struct demangle_operator_info *p;
1808
1809           i = low + (high - low) / 2;
1810           p = cplus_demangle_operators + i;
1811
1812           if (c1 == p->code[0] && c2 == p->code[1])
1813             return d_make_operator (di, p);
1814
1815           if (c1 < p->code[0] || (c1 == p->code[0] && c2 < p->code[1]))
1816             high = i;
1817           else
1818             low = i + 1;
1819           if (low == high)
1820             return NULL;
1821         }
1822     }
1823 }
1824
1825 static struct demangle_component *
1826 d_make_character (struct d_info *di, int c)
1827 {
1828   struct demangle_component *p;
1829   p = d_make_empty (di);
1830   if (p != NULL)
1831     {
1832       p->type = DEMANGLE_COMPONENT_CHARACTER;
1833       p->u.s_character.character = c;
1834     }
1835   return p;
1836 }
1837
1838 static struct demangle_component *
1839 d_java_resource (struct d_info *di)
1840 {
1841   struct demangle_component *p = NULL;
1842   struct demangle_component *next = NULL;
1843   long len, i;
1844   char c;
1845   const char *str;
1846
1847   len = d_number (di);
1848   if (len <= 1)
1849     return NULL;
1850
1851   /* Eat the leading '_'.  */
1852   if (d_next_char (di) != '_')
1853     return NULL;
1854   len--;
1855
1856   str = d_str (di);
1857   i = 0;
1858
1859   while (len > 0)
1860     {
1861       c = str[i];
1862       if (!c)
1863         return NULL;
1864
1865       /* Each chunk is either a '$' escape...  */
1866       if (c == '$')
1867         {
1868           i++;
1869           switch (str[i++])
1870             {
1871             case 'S':
1872               c = '/';
1873               break;
1874             case '_':
1875               c = '.';
1876               break;
1877             case '$':
1878               c = '$';
1879               break;
1880             default:
1881               return NULL;
1882             }
1883           next = d_make_character (di, c);
1884           d_advance (di, i);
1885           str = d_str (di);
1886           len -= i;
1887           i = 0;
1888           if (next == NULL)
1889             return NULL;
1890         }
1891       /* ... or a sequence of characters.  */
1892       else
1893         {
1894           while (i < len && str[i] && str[i] != '$')
1895             i++;
1896
1897           next = d_make_name (di, str, i);
1898           d_advance (di, i);
1899           str = d_str (di);
1900           len -= i;
1901           i = 0;
1902           if (next == NULL)
1903             return NULL;
1904         }
1905
1906       if (p == NULL)
1907         p = next;
1908       else
1909         {
1910           p = d_make_comp (di, DEMANGLE_COMPONENT_COMPOUND_NAME, p, next);
1911           if (p == NULL)
1912             return NULL;
1913         }
1914     }
1915
1916   p = d_make_comp (di, DEMANGLE_COMPONENT_JAVA_RESOURCE, p, NULL);
1917
1918   return p;
1919 }
1920
1921 /* <special-name> ::= TV <type>
1922                   ::= TT <type>
1923                   ::= TI <type>
1924                   ::= TS <type>
1925                   ::= GV <(object) name>
1926                   ::= T <call-offset> <(base) encoding>
1927                   ::= Tc <call-offset> <call-offset> <(base) encoding>
1928    Also g++ extensions:
1929                   ::= TC <type> <(offset) number> _ <(base) type>
1930                   ::= TF <type>
1931                   ::= TJ <type>
1932                   ::= GR <name>
1933                   ::= GA <encoding>
1934                   ::= Gr <resource name>
1935                   ::= GTt <encoding>
1936                   ::= GTn <encoding>
1937 */
1938
1939 static struct demangle_component *
1940 d_special_name (struct d_info *di)
1941 {
1942   di->expansion += 20;
1943   if (d_check_char (di, 'T'))
1944     {
1945       switch (d_next_char (di))
1946         {
1947         case 'V':
1948           di->expansion -= 5;
1949           return d_make_comp (di, DEMANGLE_COMPONENT_VTABLE,
1950                               cplus_demangle_type (di), NULL);
1951         case 'T':
1952           di->expansion -= 10;
1953           return d_make_comp (di, DEMANGLE_COMPONENT_VTT,
1954                               cplus_demangle_type (di), NULL);
1955         case 'I':
1956           return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO,
1957                               cplus_demangle_type (di), NULL);
1958         case 'S':
1959           return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_NAME,
1960                               cplus_demangle_type (di), NULL);
1961
1962         case 'h':
1963           if (! d_call_offset (di, 'h'))
1964             return NULL;
1965           return d_make_comp (di, DEMANGLE_COMPONENT_THUNK,
1966                               d_encoding (di, 0), NULL);
1967
1968         case 'v':
1969           if (! d_call_offset (di, 'v'))
1970             return NULL;
1971           return d_make_comp (di, DEMANGLE_COMPONENT_VIRTUAL_THUNK,
1972                               d_encoding (di, 0), NULL);
1973
1974         case 'c':
1975           if (! d_call_offset (di, '\0'))
1976             return NULL;
1977           if (! d_call_offset (di, '\0'))
1978             return NULL;
1979           return d_make_comp (di, DEMANGLE_COMPONENT_COVARIANT_THUNK,
1980                               d_encoding (di, 0), NULL);
1981
1982         case 'C':
1983           {
1984             struct demangle_component *derived_type;
1985             long offset;
1986             struct demangle_component *base_type;
1987
1988             derived_type = cplus_demangle_type (di);
1989             offset = d_number (di);
1990             if (offset < 0)
1991               return NULL;
1992             if (! d_check_char (di, '_'))
1993               return NULL;
1994             base_type = cplus_demangle_type (di);
1995             /* We don't display the offset.  FIXME: We should display
1996                it in verbose mode.  */
1997             di->expansion += 5;
1998             return d_make_comp (di, DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE,
1999                                 base_type, derived_type);
2000           }
2001
2002         case 'F':
2003           return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_FN,
2004                               cplus_demangle_type (di), NULL);
2005         case 'J':
2006           return d_make_comp (di, DEMANGLE_COMPONENT_JAVA_CLASS,
2007                               cplus_demangle_type (di), NULL);
2008
2009         case 'H':
2010           return d_make_comp (di, DEMANGLE_COMPONENT_TLS_INIT,
2011                               d_name (di), NULL);
2012
2013         case 'W':
2014           return d_make_comp (di, DEMANGLE_COMPONENT_TLS_WRAPPER,
2015                               d_name (di), NULL);
2016
2017         default:
2018           return NULL;
2019         }
2020     }
2021   else if (d_check_char (di, 'G'))
2022     {
2023       switch (d_next_char (di))
2024         {
2025         case 'V':
2026           return d_make_comp (di, DEMANGLE_COMPONENT_GUARD, d_name (di), NULL);
2027
2028         case 'R':
2029           {
2030             struct demangle_component *name = d_name (di);
2031             return d_make_comp (di, DEMANGLE_COMPONENT_REFTEMP, name,
2032                                 d_number_component (di));
2033           }
2034
2035         case 'A':
2036           return d_make_comp (di, DEMANGLE_COMPONENT_HIDDEN_ALIAS,
2037                               d_encoding (di, 0), NULL);
2038
2039         case 'T':
2040           switch (d_next_char (di))
2041             {
2042             case 'n':
2043               return d_make_comp (di, DEMANGLE_COMPONENT_NONTRANSACTION_CLONE,
2044                                   d_encoding (di, 0), NULL);
2045             default:
2046               /* ??? The proposal is that other letters (such as 'h') stand
2047                  for different variants of transaction cloning, such as
2048                  compiling directly for hardware transaction support.  But
2049                  they still should all be transactional clones of some sort
2050                  so go ahead and call them that.  */
2051             case 't':
2052               return d_make_comp (di, DEMANGLE_COMPONENT_TRANSACTION_CLONE,
2053                                   d_encoding (di, 0), NULL);
2054             }
2055
2056         case 'r':
2057           return d_java_resource (di);
2058
2059         default:
2060           return NULL;
2061         }
2062     }
2063   else
2064     return NULL;
2065 }
2066
2067 /* <call-offset> ::= h <nv-offset> _
2068                  ::= v <v-offset> _
2069
2070    <nv-offset> ::= <(offset) number>
2071
2072    <v-offset> ::= <(offset) number> _ <(virtual offset) number>
2073
2074    The C parameter, if not '\0', is a character we just read which is
2075    the start of the <call-offset>.
2076
2077    We don't display the offset information anywhere.  FIXME: We should
2078    display it in verbose mode.  */
2079
2080 static int
2081 d_call_offset (struct d_info *di, int c)
2082 {
2083   if (c == '\0')
2084     c = d_next_char (di);
2085
2086   if (c == 'h')
2087     d_number (di);
2088   else if (c == 'v')
2089     {
2090       d_number (di);
2091       if (! d_check_char (di, '_'))
2092         return 0;
2093       d_number (di);
2094     }
2095   else
2096     return 0;
2097
2098   if (! d_check_char (di, '_'))
2099     return 0;
2100
2101   return 1;
2102 }
2103
2104 /* <ctor-dtor-name> ::= C1
2105                     ::= C2
2106                     ::= C3
2107                     ::= D0
2108                     ::= D1
2109                     ::= D2
2110 */
2111
2112 static struct demangle_component *
2113 d_ctor_dtor_name (struct d_info *di)
2114 {
2115   if (di->last_name != NULL)
2116     {
2117       if (di->last_name->type == DEMANGLE_COMPONENT_NAME)
2118         di->expansion += di->last_name->u.s_name.len;
2119       else if (di->last_name->type == DEMANGLE_COMPONENT_SUB_STD)
2120         di->expansion += di->last_name->u.s_string.len;
2121     }
2122   switch (d_peek_char (di))
2123     {
2124     case 'C':
2125       {
2126         enum gnu_v3_ctor_kinds kind;
2127
2128         switch (d_peek_next_char (di))
2129           {
2130           case '1':
2131             kind = gnu_v3_complete_object_ctor;
2132             break;
2133           case '2':
2134             kind = gnu_v3_base_object_ctor;
2135             break;
2136           case '3':
2137             kind = gnu_v3_complete_object_allocating_ctor;
2138             break;
2139           case '4':
2140             kind = gnu_v3_unified_ctor;
2141             break;
2142           case '5':
2143             kind = gnu_v3_object_ctor_group;
2144             break;
2145           default:
2146             return NULL;
2147           }
2148         d_advance (di, 2);
2149         return d_make_ctor (di, kind, di->last_name);
2150       }
2151
2152     case 'D':
2153       {
2154         enum gnu_v3_dtor_kinds kind;
2155
2156         switch (d_peek_next_char (di))
2157           {
2158           case '0':
2159             kind = gnu_v3_deleting_dtor;
2160             break;
2161           case '1':
2162             kind = gnu_v3_complete_object_dtor;
2163             break;
2164           case '2':
2165             kind = gnu_v3_base_object_dtor;
2166             break;
2167           /*  digit '3' is not used */
2168           case '4':
2169             kind = gnu_v3_unified_dtor;
2170             break;
2171           case '5':
2172             kind = gnu_v3_object_dtor_group;
2173             break;
2174           default:
2175             return NULL;
2176           }
2177         d_advance (di, 2);
2178         return d_make_dtor (di, kind, di->last_name);
2179       }
2180
2181     default:
2182       return NULL;
2183     }
2184 }
2185
2186 /* <type> ::= <builtin-type>
2187           ::= <function-type>
2188           ::= <class-enum-type>
2189           ::= <array-type>
2190           ::= <pointer-to-member-type>
2191           ::= <template-param>
2192           ::= <template-template-param> <template-args>
2193           ::= <substitution>
2194           ::= <CV-qualifiers> <type>
2195           ::= P <type>
2196           ::= R <type>
2197           ::= O <type> (C++0x)
2198           ::= C <type>
2199           ::= G <type>
2200           ::= U <source-name> <type>
2201
2202    <builtin-type> ::= various one letter codes
2203                   ::= u <source-name>
2204 */
2205
2206 CP_STATIC_IF_GLIBCPP_V3
2207 const struct demangle_builtin_type_info
2208 cplus_demangle_builtin_types[D_BUILTIN_TYPE_COUNT] =
2209 {
2210   /* a */ { NL ("signed char"), NL ("signed char"),     D_PRINT_DEFAULT },
2211   /* b */ { NL ("bool"),        NL ("boolean"),         D_PRINT_BOOL },
2212   /* c */ { NL ("char"),        NL ("byte"),            D_PRINT_DEFAULT },
2213   /* d */ { NL ("double"),      NL ("double"),          D_PRINT_FLOAT },
2214   /* e */ { NL ("long double"), NL ("long double"),     D_PRINT_FLOAT },
2215   /* f */ { NL ("float"),       NL ("float"),           D_PRINT_FLOAT },
2216   /* g */ { NL ("__float128"),  NL ("__float128"),      D_PRINT_FLOAT },
2217   /* h */ { NL ("unsigned char"), NL ("unsigned char"), D_PRINT_DEFAULT },
2218   /* i */ { NL ("int"),         NL ("int"),             D_PRINT_INT },
2219   /* j */ { NL ("unsigned int"), NL ("unsigned"),       D_PRINT_UNSIGNED },
2220   /* k */ { NULL, 0,            NULL, 0,                D_PRINT_DEFAULT },
2221   /* l */ { NL ("long"),        NL ("long"),            D_PRINT_LONG },
2222   /* m */ { NL ("unsigned long"), NL ("unsigned long"), D_PRINT_UNSIGNED_LONG },
2223   /* n */ { NL ("__int128"),    NL ("__int128"),        D_PRINT_DEFAULT },
2224   /* o */ { NL ("unsigned __int128"), NL ("unsigned __int128"),
2225             D_PRINT_DEFAULT },
2226   /* p */ { NULL, 0,            NULL, 0,                D_PRINT_DEFAULT },
2227   /* q */ { NULL, 0,            NULL, 0,                D_PRINT_DEFAULT },
2228   /* r */ { NULL, 0,            NULL, 0,                D_PRINT_DEFAULT },
2229   /* s */ { NL ("short"),       NL ("short"),           D_PRINT_DEFAULT },
2230   /* t */ { NL ("unsigned short"), NL ("unsigned short"), D_PRINT_DEFAULT },
2231   /* u */ { NULL, 0,            NULL, 0,                D_PRINT_DEFAULT },
2232   /* v */ { NL ("void"),        NL ("void"),            D_PRINT_VOID },
2233   /* w */ { NL ("wchar_t"),     NL ("char"),            D_PRINT_DEFAULT },
2234   /* x */ { NL ("long long"),   NL ("long"),            D_PRINT_LONG_LONG },
2235   /* y */ { NL ("unsigned long long"), NL ("unsigned long long"),
2236             D_PRINT_UNSIGNED_LONG_LONG },
2237   /* z */ { NL ("..."),         NL ("..."),             D_PRINT_DEFAULT },
2238   /* 26 */ { NL ("decimal32"),  NL ("decimal32"),       D_PRINT_DEFAULT },
2239   /* 27 */ { NL ("decimal64"),  NL ("decimal64"),       D_PRINT_DEFAULT },
2240   /* 28 */ { NL ("decimal128"), NL ("decimal128"),      D_PRINT_DEFAULT },
2241   /* 29 */ { NL ("half"),       NL ("half"),            D_PRINT_FLOAT },
2242   /* 30 */ { NL ("char16_t"),   NL ("char16_t"),        D_PRINT_DEFAULT },
2243   /* 31 */ { NL ("char32_t"),   NL ("char32_t"),        D_PRINT_DEFAULT },
2244   /* 32 */ { NL ("decltype(nullptr)"),  NL ("decltype(nullptr)"),
2245              D_PRINT_DEFAULT },
2246 };
2247
2248 CP_STATIC_IF_GLIBCPP_V3
2249 struct demangle_component *
2250 cplus_demangle_type (struct d_info *di)
2251 {
2252   char peek;
2253   struct demangle_component *ret;
2254   int can_subst;
2255
2256   /* The ABI specifies that when CV-qualifiers are used, the base type
2257      is substitutable, and the fully qualified type is substitutable,
2258      but the base type with a strict subset of the CV-qualifiers is
2259      not substitutable.  The natural recursive implementation of the
2260      CV-qualifiers would cause subsets to be substitutable, so instead
2261      we pull them all off now.
2262
2263      FIXME: The ABI says that order-insensitive vendor qualifiers
2264      should be handled in the same way, but we have no way to tell
2265      which vendor qualifiers are order-insensitive and which are
2266      order-sensitive.  So we just assume that they are all
2267      order-sensitive.  g++ 3.4 supports only one vendor qualifier,
2268      __vector, and it treats it as order-sensitive when mangling
2269      names.  */
2270
2271   peek = d_peek_char (di);
2272   if (peek == 'r' || peek == 'V' || peek == 'K')
2273     {
2274       struct demangle_component **pret;
2275
2276       pret = d_cv_qualifiers (di, &ret, 0);
2277       if (pret == NULL)
2278         return NULL;
2279       if (d_peek_char (di) == 'F')
2280         {
2281           /* cv-qualifiers before a function type apply to 'this',
2282              so avoid adding the unqualified function type to
2283              the substitution list.  */
2284           *pret = d_function_type (di);
2285         }
2286       else
2287         *pret = cplus_demangle_type (di);
2288       if (!*pret)
2289         return NULL;
2290       if ((*pret)->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
2291           || (*pret)->type == DEMANGLE_COMPONENT_REFERENCE_THIS)
2292         {
2293           /* Move the ref-qualifier outside the cv-qualifiers so that
2294              they are printed in the right order.  */
2295           struct demangle_component *fn = d_left (*pret);
2296           d_left (*pret) = ret;
2297           ret = *pret;
2298           *pret = fn;
2299         }
2300       if (! d_add_substitution (di, ret))
2301         return NULL;
2302       return ret;
2303     }
2304
2305   can_subst = 1;
2306
2307   switch (peek)
2308     {
2309     case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
2310     case 'h': case 'i': case 'j':           case 'l': case 'm': case 'n':
2311     case 'o':                               case 's': case 't':
2312     case 'v': case 'w': case 'x': case 'y': case 'z':
2313       ret = d_make_builtin_type (di,
2314                                  &cplus_demangle_builtin_types[peek - 'a']);
2315       di->expansion += ret->u.s_builtin.type->len;
2316       can_subst = 0;
2317       d_advance (di, 1);
2318       break;
2319
2320     case 'u':
2321       d_advance (di, 1);
2322       ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE,
2323                          d_source_name (di), NULL);
2324       break;
2325
2326     case 'F':
2327       ret = d_function_type (di);
2328       break;
2329
2330     case '0': case '1': case '2': case '3': case '4':
2331     case '5': case '6': case '7': case '8': case '9':
2332     case 'N':
2333     case 'Z':
2334       ret = d_class_enum_type (di);
2335       break;
2336
2337     case 'A':
2338       ret = d_array_type (di);
2339       break;
2340
2341     case 'M':
2342       ret = d_pointer_to_member_type (di);
2343       break;
2344
2345     case 'T':
2346       ret = d_template_param (di);
2347       if (d_peek_char (di) == 'I')
2348         {
2349           /* This may be <template-template-param> <template-args>.
2350              If this is the type for a conversion operator, we can
2351              have a <template-template-param> here only by following
2352              a derivation like this:
2353
2354              <nested-name>
2355              -> <template-prefix> <template-args>
2356              -> <prefix> <template-unqualified-name> <template-args>
2357              -> <unqualified-name> <template-unqualified-name> <template-args>
2358              -> <source-name> <template-unqualified-name> <template-args>
2359              -> <source-name> <operator-name> <template-args>
2360              -> <source-name> cv <type> <template-args>
2361              -> <source-name> cv <template-template-param> <template-args> <template-args>
2362
2363              where the <template-args> is followed by another.
2364              Otherwise, we must have a derivation like this:
2365
2366              <nested-name>
2367              -> <template-prefix> <template-args>
2368              -> <prefix> <template-unqualified-name> <template-args>
2369              -> <unqualified-name> <template-unqualified-name> <template-args>
2370              -> <source-name> <template-unqualified-name> <template-args>
2371              -> <source-name> <operator-name> <template-args>
2372              -> <source-name> cv <type> <template-args>
2373              -> <source-name> cv <template-param> <template-args>
2374
2375              where we need to leave the <template-args> to be processed
2376              by d_prefix (following the <template-prefix>).
2377
2378              The <template-template-param> part is a substitution
2379              candidate.  */
2380           if (! di->is_conversion)
2381             {
2382               if (! d_add_substitution (di, ret))
2383                 return NULL;
2384               ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2385                                  d_template_args (di));
2386             }
2387           else
2388             {
2389               struct demangle_component *args;
2390               struct d_info_checkpoint checkpoint;
2391
2392               d_checkpoint (di, &checkpoint);
2393               args = d_template_args (di);
2394               if (d_peek_char (di) == 'I')
2395                 {
2396                   if (! d_add_substitution (di, ret))
2397                     return NULL;
2398                   ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2399                                      args);
2400                 }
2401               else
2402                 d_backtrack (di, &checkpoint);
2403             }
2404         }
2405       break;
2406
2407     case 'S':
2408       /* If this is a special substitution, then it is the start of
2409          <class-enum-type>.  */
2410       {
2411         char peek_next;
2412
2413         peek_next = d_peek_next_char (di);
2414         if (IS_DIGIT (peek_next)
2415             || peek_next == '_'
2416             || IS_UPPER (peek_next))
2417           {
2418             ret = d_substitution (di, 0);
2419             /* The substituted name may have been a template name and
2420                may be followed by tepmlate args.  */
2421             if (d_peek_char (di) == 'I')
2422               ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2423                                  d_template_args (di));
2424             else
2425               can_subst = 0;
2426           }
2427         else
2428           {
2429             ret = d_class_enum_type (di);
2430             /* If the substitution was a complete type, then it is not
2431                a new substitution candidate.  However, if the
2432                substitution was followed by template arguments, then
2433                the whole thing is a substitution candidate.  */
2434             if (ret != NULL && ret->type == DEMANGLE_COMPONENT_SUB_STD)
2435               can_subst = 0;
2436           }
2437       }
2438       break;
2439
2440     case 'O':
2441       d_advance (di, 1);
2442       ret = d_make_comp (di, DEMANGLE_COMPONENT_RVALUE_REFERENCE,
2443                          cplus_demangle_type (di), NULL);
2444       break;
2445
2446     case 'P':
2447       d_advance (di, 1);
2448       ret = d_make_comp (di, DEMANGLE_COMPONENT_POINTER,
2449                          cplus_demangle_type (di), NULL);
2450       break;
2451
2452     case 'R':
2453       d_advance (di, 1);
2454       ret = d_make_comp (di, DEMANGLE_COMPONENT_REFERENCE,
2455                          cplus_demangle_type (di), NULL);
2456       break;
2457
2458     case 'C':
2459       d_advance (di, 1);
2460       ret = d_make_comp (di, DEMANGLE_COMPONENT_COMPLEX,
2461                          cplus_demangle_type (di), NULL);
2462       break;
2463
2464     case 'G':
2465       d_advance (di, 1);
2466       ret = d_make_comp (di, DEMANGLE_COMPONENT_IMAGINARY,
2467                          cplus_demangle_type (di), NULL);
2468       break;
2469
2470     case 'U':
2471       d_advance (di, 1);
2472       ret = d_source_name (di);
2473       ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL,
2474                          cplus_demangle_type (di), ret);
2475       break;
2476
2477     case 'D':
2478       can_subst = 0;
2479       d_advance (di, 1);
2480       peek = d_next_char (di);
2481       switch (peek)
2482         {
2483         case 'T':
2484         case 't':
2485           /* decltype (expression) */
2486           ret = d_make_comp (di, DEMANGLE_COMPONENT_DECLTYPE,
2487                              d_expression (di), NULL);
2488           if (ret && d_next_char (di) != 'E')
2489             ret = NULL;
2490           can_subst = 1;
2491           break;
2492           
2493         case 'p':
2494           /* Pack expansion.  */
2495           ret = d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION,
2496                              cplus_demangle_type (di), NULL);
2497           can_subst = 1;
2498           break;
2499
2500         case 'a':
2501           /* auto */
2502           ret = d_make_name (di, "auto", 4);
2503           break;
2504           
2505         case 'f':
2506           /* 32-bit decimal floating point */
2507           ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[26]);
2508           di->expansion += ret->u.s_builtin.type->len;
2509           break;
2510         case 'd':
2511           /* 64-bit DFP */
2512           ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[27]);
2513           di->expansion += ret->u.s_builtin.type->len;
2514           break;
2515         case 'e':
2516           /* 128-bit DFP */
2517           ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[28]);
2518           di->expansion += ret->u.s_builtin.type->len;
2519           break;
2520         case 'h':
2521           /* 16-bit half-precision FP */
2522           ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[29]);
2523           di->expansion += ret->u.s_builtin.type->len;
2524           break;
2525         case 's':
2526           /* char16_t */
2527           ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[30]);
2528           di->expansion += ret->u.s_builtin.type->len;
2529           break;
2530         case 'i':
2531           /* char32_t */
2532           ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[31]);
2533           di->expansion += ret->u.s_builtin.type->len;
2534           break;
2535
2536         case 'F':
2537           /* Fixed point types. DF<int bits><length><fract bits><sat>  */
2538           ret = d_make_empty (di);
2539           ret->type = DEMANGLE_COMPONENT_FIXED_TYPE;
2540           if ((ret->u.s_fixed.accum = IS_DIGIT (d_peek_char (di))))
2541             /* For demangling we don't care about the bits.  */
2542             d_number (di);
2543           ret->u.s_fixed.length = cplus_demangle_type (di);
2544           if (ret->u.s_fixed.length == NULL)
2545             return NULL;
2546           d_number (di);
2547           peek = d_next_char (di);
2548           ret->u.s_fixed.sat = (peek == 's');
2549           break;
2550
2551         case 'v':
2552           ret = d_vector_type (di);
2553           can_subst = 1;
2554           break;
2555
2556         case 'n':
2557           /* decltype(nullptr) */
2558           ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[32]);
2559           di->expansion += ret->u.s_builtin.type->len;
2560           break;
2561
2562         default:
2563           return NULL;
2564         }
2565       break;
2566
2567     default:
2568       return NULL;
2569     }
2570
2571   if (can_subst)
2572     {
2573       if (! d_add_substitution (di, ret))
2574         return NULL;
2575     }
2576
2577   return ret;
2578 }
2579
2580 /* <CV-qualifiers> ::= [r] [V] [K]  */
2581
2582 static struct demangle_component **
2583 d_cv_qualifiers (struct d_info *di,
2584                  struct demangle_component **pret, int member_fn)
2585 {
2586   struct demangle_component **pstart;
2587   char peek;
2588
2589   pstart = pret;
2590   peek = d_peek_char (di);
2591   while (peek == 'r' || peek == 'V' || peek == 'K')
2592     {
2593       enum demangle_component_type t;
2594
2595       d_advance (di, 1);
2596       if (peek == 'r')
2597         {
2598           t = (member_fn
2599                ? DEMANGLE_COMPONENT_RESTRICT_THIS
2600                : DEMANGLE_COMPONENT_RESTRICT);
2601           di->expansion += sizeof "restrict";
2602         }
2603       else if (peek == 'V')
2604         {
2605           t = (member_fn
2606                ? DEMANGLE_COMPONENT_VOLATILE_THIS
2607                : DEMANGLE_COMPONENT_VOLATILE);
2608           di->expansion += sizeof "volatile";
2609         }
2610       else
2611         {
2612           t = (member_fn
2613                ? DEMANGLE_COMPONENT_CONST_THIS
2614                : DEMANGLE_COMPONENT_CONST);
2615           di->expansion += sizeof "const";
2616         }
2617
2618       *pret = d_make_comp (di, t, NULL, NULL);
2619       if (*pret == NULL)
2620         return NULL;
2621       pret = &d_left (*pret);
2622
2623       peek = d_peek_char (di);
2624     }
2625
2626   if (!member_fn && peek == 'F')
2627     {
2628       while (pstart != pret)
2629         {
2630           switch ((*pstart)->type)
2631             {
2632             case DEMANGLE_COMPONENT_RESTRICT:
2633               (*pstart)->type = DEMANGLE_COMPONENT_RESTRICT_THIS;
2634               break;
2635             case DEMANGLE_COMPONENT_VOLATILE:
2636               (*pstart)->type = DEMANGLE_COMPONENT_VOLATILE_THIS;
2637               break;
2638             case DEMANGLE_COMPONENT_CONST:
2639               (*pstart)->type = DEMANGLE_COMPONENT_CONST_THIS;
2640               break;
2641             default:
2642               break;
2643             }
2644           pstart = &d_left (*pstart);
2645         }
2646     }
2647
2648   return pret;
2649 }
2650
2651 /* <ref-qualifier> ::= R
2652                    ::= O */
2653
2654 static struct demangle_component *
2655 d_ref_qualifier (struct d_info *di, struct demangle_component *sub)
2656 {
2657   struct demangle_component *ret = sub;
2658   char peek;
2659
2660   peek = d_peek_char (di);
2661   if (peek == 'R' || peek == 'O')
2662     {
2663       enum demangle_component_type t;
2664       if (peek == 'R')
2665         {
2666           t = DEMANGLE_COMPONENT_REFERENCE_THIS;
2667           di->expansion += sizeof "&";
2668         }
2669       else
2670         {
2671           t = DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS;
2672           di->expansion += sizeof "&&";
2673         }
2674       d_advance (di, 1);
2675
2676       ret = d_make_comp (di, t, ret, NULL);
2677     }
2678
2679   return ret;
2680 }
2681
2682 /* <function-type> ::= F [Y] <bare-function-type> [<ref-qualifier>] E  */
2683
2684 static struct demangle_component *
2685 d_function_type (struct d_info *di)
2686 {
2687   struct demangle_component *ret;
2688
2689   if (! d_check_char (di, 'F'))
2690     return NULL;
2691   if (d_peek_char (di) == 'Y')
2692     {
2693       /* Function has C linkage.  We don't print this information.
2694          FIXME: We should print it in verbose mode.  */
2695       d_advance (di, 1);
2696     }
2697   ret = d_bare_function_type (di, 1);
2698   ret = d_ref_qualifier (di, ret);
2699
2700   if (! d_check_char (di, 'E'))
2701     return NULL;
2702   return ret;
2703 }
2704
2705 /* <type>+ */
2706
2707 static struct demangle_component *
2708 d_parmlist (struct d_info *di)
2709 {
2710   struct demangle_component *tl;
2711   struct demangle_component **ptl;
2712
2713   tl = NULL;
2714   ptl = &tl;
2715   while (1)
2716     {
2717       struct demangle_component *type;
2718
2719       char peek = d_peek_char (di);
2720       if (peek == '\0' || peek == 'E' || peek == '.')
2721         break;
2722       if ((peek == 'R' || peek == 'O')
2723           && d_peek_next_char (di) == 'E')
2724         /* Function ref-qualifier, not a ref prefix for a parameter type.  */
2725         break;
2726       type = cplus_demangle_type (di);
2727       if (type == NULL)
2728         return NULL;
2729       *ptl = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, type, NULL);
2730       if (*ptl == NULL)
2731         return NULL;
2732       ptl = &d_right (*ptl);
2733     }
2734
2735   /* There should be at least one parameter type besides the optional
2736      return type.  A function which takes no arguments will have a
2737      single parameter type void.  */
2738   if (tl == NULL)
2739     return NULL;
2740
2741   /* If we have a single parameter type void, omit it.  */
2742   if (d_right (tl) == NULL
2743       && d_left (tl)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
2744       && d_left (tl)->u.s_builtin.type->print == D_PRINT_VOID)
2745     {
2746       di->expansion -= d_left (tl)->u.s_builtin.type->len;
2747       d_left (tl) = NULL;
2748     }
2749
2750   return tl;
2751 }
2752
2753 /* <bare-function-type> ::= [J]<type>+  */
2754
2755 static struct demangle_component *
2756 d_bare_function_type (struct d_info *di, int has_return_type)
2757 {
2758   struct demangle_component *return_type;
2759   struct demangle_component *tl;
2760   char peek;
2761
2762   /* Detect special qualifier indicating that the first argument
2763      is the return type.  */
2764   peek = d_peek_char (di);
2765   if (peek == 'J')
2766     {
2767       d_advance (di, 1);
2768       has_return_type = 1;
2769     }
2770
2771   if (has_return_type)
2772     {
2773       return_type = cplus_demangle_type (di);
2774       if (return_type == NULL)
2775         return NULL;
2776     }
2777   else
2778     return_type = NULL;
2779
2780   tl = d_parmlist (di);
2781   if (tl == NULL)
2782     return NULL;
2783
2784   return d_make_comp (di, DEMANGLE_COMPONENT_FUNCTION_TYPE,
2785                       return_type, tl);
2786 }
2787
2788 /* <class-enum-type> ::= <name>  */
2789
2790 static struct demangle_component *
2791 d_class_enum_type (struct d_info *di)
2792 {
2793   return d_name (di);
2794 }
2795
2796 /* <array-type> ::= A <(positive dimension) number> _ <(element) type>
2797                 ::= A [<(dimension) expression>] _ <(element) type>
2798 */
2799
2800 static struct demangle_component *
2801 d_array_type (struct d_info *di)
2802 {
2803   char peek;
2804   struct demangle_component *dim;
2805
2806   if (! d_check_char (di, 'A'))
2807     return NULL;
2808
2809   peek = d_peek_char (di);
2810   if (peek == '_')
2811     dim = NULL;
2812   else if (IS_DIGIT (peek))
2813     {
2814       const char *s;
2815
2816       s = d_str (di);
2817       do
2818         {
2819           d_advance (di, 1);
2820           peek = d_peek_char (di);
2821         }
2822       while (IS_DIGIT (peek));
2823       dim = d_make_name (di, s, d_str (di) - s);
2824       if (dim == NULL)
2825         return NULL;
2826     }
2827   else
2828     {
2829       dim = d_expression (di);
2830       if (dim == NULL)
2831         return NULL;
2832     }
2833
2834   if (! d_check_char (di, '_'))
2835     return NULL;
2836
2837   return d_make_comp (di, DEMANGLE_COMPONENT_ARRAY_TYPE, dim,
2838                       cplus_demangle_type (di));
2839 }
2840
2841 /* <vector-type> ::= Dv <number> _ <type>
2842                  ::= Dv _ <expression> _ <type> */
2843
2844 static struct demangle_component *
2845 d_vector_type (struct d_info *di)
2846 {
2847   char peek;
2848   struct demangle_component *dim;
2849
2850   peek = d_peek_char (di);
2851   if (peek == '_')
2852     {
2853       d_advance (di, 1);
2854       dim = d_expression (di);
2855     }
2856   else
2857     dim = d_number_component (di);
2858
2859   if (dim == NULL)
2860     return NULL;
2861
2862   if (! d_check_char (di, '_'))
2863     return NULL;
2864
2865   return d_make_comp (di, DEMANGLE_COMPONENT_VECTOR_TYPE, dim,
2866                       cplus_demangle_type (di));
2867 }
2868
2869 /* <pointer-to-member-type> ::= M <(class) type> <(member) type>  */
2870
2871 static struct demangle_component *
2872 d_pointer_to_member_type (struct d_info *di)
2873 {
2874   struct demangle_component *cl;
2875   struct demangle_component *mem;
2876
2877   if (! d_check_char (di, 'M'))
2878     return NULL;
2879
2880   cl = cplus_demangle_type (di);
2881   if (cl == NULL)
2882     return NULL;
2883
2884   /* The ABI says, "The type of a non-static member function is considered
2885      to be different, for the purposes of substitution, from the type of a
2886      namespace-scope or static member function whose type appears
2887      similar. The types of two non-static member functions are considered
2888      to be different, for the purposes of substitution, if the functions
2889      are members of different classes. In other words, for the purposes of
2890      substitution, the class of which the function is a member is
2891      considered part of the type of function."
2892
2893      For a pointer to member function, this call to cplus_demangle_type
2894      will end up adding a (possibly qualified) non-member function type to
2895      the substitution table, which is not correct; however, the member
2896      function type will never be used in a substitution, so putting the
2897      wrong type in the substitution table is harmless.  */
2898
2899   mem = cplus_demangle_type (di);
2900   if (mem == NULL)
2901     return NULL;
2902
2903   return d_make_comp (di, DEMANGLE_COMPONENT_PTRMEM_TYPE, cl, mem);
2904 }
2905
2906 /* <non-negative number> _ */
2907
2908 static long
2909 d_compact_number (struct d_info *di)
2910 {
2911   long num;
2912   if (d_peek_char (di) == '_')
2913     num = 0;
2914   else if (d_peek_char (di) == 'n')
2915     return -1;
2916   else
2917     num = d_number (di) + 1;
2918
2919   if (! d_check_char (di, '_'))
2920     return -1;
2921   return num;
2922 }
2923
2924 /* <template-param> ::= T_
2925                     ::= T <(parameter-2 non-negative) number> _
2926 */
2927
2928 static struct demangle_component *
2929 d_template_param (struct d_info *di)
2930 {
2931   long param;
2932
2933   if (! d_check_char (di, 'T'))
2934     return NULL;
2935
2936   param = d_compact_number (di);
2937   if (param < 0)
2938     return NULL;
2939
2940   ++di->did_subs;
2941
2942   return d_make_template_param (di, param);
2943 }
2944
2945 /* <template-args> ::= I <template-arg>+ E  */
2946
2947 static struct demangle_component *
2948 d_template_args (struct d_info *di)
2949 {
2950   struct demangle_component *hold_last_name;
2951   struct demangle_component *al;
2952   struct demangle_component **pal;
2953
2954   /* Preserve the last name we saw--don't let the template arguments
2955      clobber it, as that would give us the wrong name for a subsequent
2956      constructor or destructor.  */
2957   hold_last_name = di->last_name;
2958
2959   if (d_peek_char (di) != 'I'
2960       && d_peek_char (di) != 'J')
2961     return NULL;
2962   d_advance (di, 1);
2963
2964   if (d_peek_char (di) == 'E')
2965     {
2966       /* An argument pack can be empty.  */
2967       d_advance (di, 1);
2968       return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, NULL, NULL);
2969     }
2970
2971   al = NULL;
2972   pal = &al;
2973   while (1)
2974     {
2975       struct demangle_component *a;
2976
2977       a = d_template_arg (di);
2978       if (a == NULL)
2979         return NULL;
2980
2981       *pal = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, a, NULL);
2982       if (*pal == NULL)
2983         return NULL;
2984       pal = &d_right (*pal);
2985
2986       if (d_peek_char (di) == 'E')
2987         {
2988           d_advance (di, 1);
2989           break;
2990         }
2991     }
2992
2993   di->last_name = hold_last_name;
2994
2995   return al;
2996 }
2997
2998 /* <template-arg> ::= <type>
2999                   ::= X <expression> E
3000                   ::= <expr-primary>
3001 */
3002
3003 static struct demangle_component *
3004 d_template_arg (struct d_info *di)
3005 {
3006   struct demangle_component *ret;
3007
3008   switch (d_peek_char (di))
3009     {
3010     case 'X':
3011       d_advance (di, 1);
3012       ret = d_expression (di);
3013       if (! d_check_char (di, 'E'))
3014         return NULL;
3015       return ret;
3016
3017     case 'L':
3018       return d_expr_primary (di);
3019
3020     case 'I':
3021     case 'J':
3022       /* An argument pack.  */
3023       return d_template_args (di);
3024
3025     default:
3026       return cplus_demangle_type (di);
3027     }
3028 }
3029
3030 /* Parse a sequence of expressions until we hit the terminator
3031    character.  */
3032
3033 static struct demangle_component *
3034 d_exprlist (struct d_info *di, char terminator)
3035 {
3036   struct demangle_component *list = NULL;
3037   struct demangle_component **p = &list;
3038
3039   if (d_peek_char (di) == terminator)
3040     {
3041       d_advance (di, 1);
3042       return d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, NULL, NULL);
3043     }
3044
3045   while (1)
3046     {
3047       struct demangle_component *arg = d_expression (di);
3048       if (arg == NULL)
3049         return NULL;
3050
3051       *p = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, arg, NULL);
3052       if (*p == NULL)
3053         return NULL;
3054       p = &d_right (*p);
3055
3056       if (d_peek_char (di) == terminator)
3057         {
3058           d_advance (di, 1);
3059           break;
3060         }
3061     }
3062
3063   return list;
3064 }
3065
3066 /* Returns nonzero iff OP is an operator for a C++ cast: const_cast,
3067    dynamic_cast, static_cast or reinterpret_cast.  */
3068
3069 static int
3070 op_is_new_cast (struct demangle_component *op)
3071 {
3072   const char *code = op->u.s_operator.op->code;
3073   return (code[1] == 'c'
3074           && (code[0] == 's' || code[0] == 'd'
3075               || code[0] == 'c' || code[0] == 'r'));
3076 }
3077
3078 /* <expression> ::= <(unary) operator-name> <expression>
3079                 ::= <(binary) operator-name> <expression> <expression>
3080                 ::= <(trinary) operator-name> <expression> <expression> <expression>
3081                 ::= cl <expression>+ E
3082                 ::= st <type>
3083                 ::= <template-param>
3084                 ::= sr <type> <unqualified-name>
3085                 ::= sr <type> <unqualified-name> <template-args>
3086                 ::= <expr-primary>
3087 */
3088
3089 static inline struct demangle_component *
3090 d_expression_1 (struct d_info *di)
3091 {
3092   char peek;
3093
3094   peek = d_peek_char (di);
3095   if (peek == 'L')
3096     return d_expr_primary (di);
3097   else if (peek == 'T')
3098     return d_template_param (di);
3099   else if (peek == 's' && d_peek_next_char (di) == 'r')
3100     {
3101       struct demangle_component *type;
3102       struct demangle_component *name;
3103
3104       d_advance (di, 2);
3105       type = cplus_demangle_type (di);
3106       name = d_unqualified_name (di);
3107       if (d_peek_char (di) != 'I')
3108         return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type, name);
3109       else
3110         return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type,
3111                             d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
3112                                          d_template_args (di)));
3113     }
3114   else if (peek == 's' && d_peek_next_char (di) == 'p')
3115     {
3116       d_advance (di, 2);
3117       return d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION,
3118                           d_expression_1 (di), NULL);
3119     }
3120   else if (peek == 'f' && d_peek_next_char (di) == 'p')
3121     {
3122       /* Function parameter used in a late-specified return type.  */
3123       int index;
3124       d_advance (di, 2);
3125       if (d_peek_char (di) == 'T')
3126         {
3127           /* 'this' parameter.  */
3128           d_advance (di, 1);
3129           index = 0;
3130         }
3131       else
3132         {
3133           index = d_compact_number (di) + 1;
3134           if (index == 0)
3135             return NULL;
3136         }
3137       return d_make_function_param (di, index);
3138     }
3139   else if (IS_DIGIT (peek)
3140            || (peek == 'o' && d_peek_next_char (di) == 'n'))
3141     {
3142       /* We can get an unqualified name as an expression in the case of
3143          a dependent function call, i.e. decltype(f(t)).  */
3144       struct demangle_component *name;
3145
3146       if (peek == 'o')
3147         /* operator-function-id, i.e. operator+(t).  */
3148         d_advance (di, 2);
3149
3150       name = d_unqualified_name (di);
3151       if (name == NULL)
3152         return NULL;
3153       if (d_peek_char (di) == 'I')
3154         return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
3155                             d_template_args (di));
3156       else
3157         return name;
3158     }
3159   else if ((peek == 'i' || peek == 't')
3160            && d_peek_next_char (di) == 'l')
3161     {
3162       /* Brace-enclosed initializer list, untyped or typed.  */
3163       struct demangle_component *type = NULL;
3164       if (peek == 't')
3165         type = cplus_demangle_type (di);
3166       d_advance (di, 2);
3167       return d_make_comp (di, DEMANGLE_COMPONENT_INITIALIZER_LIST,
3168                           type, d_exprlist (di, 'E'));
3169     }
3170   else
3171     {
3172       struct demangle_component *op;
3173       const char *code = NULL;
3174       int args;
3175
3176       op = d_operator_name (di);
3177       if (op == NULL)
3178         return NULL;
3179
3180       if (op->type == DEMANGLE_COMPONENT_OPERATOR)
3181         {
3182           code = op->u.s_operator.op->code;
3183           di->expansion += op->u.s_operator.op->len - 2;
3184           if (strcmp (code, "st") == 0)
3185             return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
3186                                 cplus_demangle_type (di));
3187         }
3188
3189       switch (op->type)
3190         {
3191         default:
3192           return NULL;
3193         case DEMANGLE_COMPONENT_OPERATOR:
3194           args = op->u.s_operator.op->args;
3195           break;
3196         case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
3197           args = op->u.s_extended_operator.args;
3198           break;
3199         case DEMANGLE_COMPONENT_CAST:
3200           args = 1;
3201           break;
3202         }
3203
3204       switch (args)
3205         {
3206         case 0:
3207           return d_make_comp (di, DEMANGLE_COMPONENT_NULLARY, op, NULL);
3208
3209         case 1:
3210           {
3211             struct demangle_component *operand;
3212             int suffix = 0;
3213
3214             if (code && (code[0] == 'p' || code[0] == 'm')
3215                 && code[1] == code[0])
3216               /* pp_ and mm_ are the prefix variants.  */
3217               suffix = !d_check_char (di, '_');
3218
3219             if (op->type == DEMANGLE_COMPONENT_CAST
3220                 && d_check_char (di, '_'))
3221               operand = d_exprlist (di, 'E');
3222             else
3223               operand = d_expression_1 (di);
3224
3225             if (suffix)
3226               /* Indicate the suffix variant for d_print_comp.  */
3227               return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
3228                                   d_make_comp (di,
3229                                                DEMANGLE_COMPONENT_BINARY_ARGS,
3230                                                operand, operand));
3231             else
3232               return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
3233                                   operand);
3234           }
3235         case 2:
3236           {
3237             struct demangle_component *left;
3238             struct demangle_component *right;
3239
3240             if (op_is_new_cast (op))
3241               left = cplus_demangle_type (di);
3242             else
3243               left = d_expression_1 (di);
3244             if (!strcmp (code, "cl"))
3245               right = d_exprlist (di, 'E');
3246             else if (!strcmp (code, "dt") || !strcmp (code, "pt"))
3247               {
3248                 right = d_unqualified_name (di);
3249                 if (d_peek_char (di) == 'I')
3250                   right = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE,
3251                                        right, d_template_args (di));
3252               }
3253             else
3254               right = d_expression_1 (di);
3255
3256             return d_make_comp (di, DEMANGLE_COMPONENT_BINARY, op,
3257                                 d_make_comp (di,
3258                                              DEMANGLE_COMPONENT_BINARY_ARGS,
3259                                              left, right));
3260           }
3261         case 3:
3262           {
3263             struct demangle_component *first;
3264             struct demangle_component *second;
3265             struct demangle_component *third;
3266
3267             if (!strcmp (code, "qu"))
3268               {
3269                 /* ?: expression.  */
3270                 first = d_expression_1 (di);
3271                 second = d_expression_1 (di);
3272                 third = d_expression_1 (di);
3273               }
3274             else if (code[0] == 'n')
3275               {
3276                 /* new-expression.  */
3277                 if (code[1] != 'w' && code[1] != 'a')
3278                   return NULL;
3279                 first = d_exprlist (di, '_');
3280                 second = cplus_demangle_type (di);
3281                 if (d_peek_char (di) == 'E')
3282                   {
3283                     d_advance (di, 1);
3284                     third = NULL;
3285                   }
3286                 else if (d_peek_char (di) == 'p'
3287                          && d_peek_next_char (di) == 'i')
3288                   {
3289                     /* Parenthesized initializer.  */
3290                     d_advance (di, 2);
3291                     third = d_exprlist (di, 'E');
3292                   }
3293                 else if (d_peek_char (di) == 'i'
3294                          && d_peek_next_char (di) == 'l')
3295                   /* initializer-list.  */
3296                   third = d_expression_1 (di);
3297                 else
3298                   return NULL;
3299               }
3300             else
3301               return NULL;
3302             return d_make_comp (di, DEMANGLE_COMPONENT_TRINARY, op,
3303                                 d_make_comp (di,
3304                                              DEMANGLE_COMPONENT_TRINARY_ARG1,
3305                                              first,
3306                                              d_make_comp (di,
3307                                                           DEMANGLE_COMPONENT_TRINARY_ARG2,
3308                                                           second, third)));
3309           }
3310         default:
3311           return NULL;
3312         }
3313     }
3314 }
3315
3316 static struct demangle_component *
3317 d_expression (struct d_info *di)
3318 {
3319   struct demangle_component *ret;
3320   int was_expression = di->is_expression;
3321
3322   di->is_expression = 1;
3323   ret = d_expression_1 (di);
3324   di->is_expression = was_expression;
3325   return ret;
3326 }
3327
3328 /* <expr-primary> ::= L <type> <(value) number> E
3329                   ::= L <type> <(value) float> E
3330                   ::= L <mangled-name> E
3331 */
3332
3333 static struct demangle_component *
3334 d_expr_primary (struct d_info *di)
3335 {
3336   struct demangle_component *ret;
3337
3338   if (! d_check_char (di, 'L'))
3339     return NULL;
3340   if (d_peek_char (di) == '_'
3341       /* Workaround for G++ bug; see comment in write_template_arg.  */
3342       || d_peek_char (di) == 'Z')
3343     ret = cplus_demangle_mangled_name (di, 0);
3344   else
3345     {
3346       struct demangle_component *type;
3347       enum demangle_component_type t;
3348       const char *s;
3349
3350       type = cplus_demangle_type (di);
3351       if (type == NULL)
3352         return NULL;
3353
3354       /* If we have a type we know how to print, we aren't going to
3355          print the type name itself.  */
3356       if (type->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
3357           && type->u.s_builtin.type->print != D_PRINT_DEFAULT)
3358         di->expansion -= type->u.s_builtin.type->len;
3359
3360       /* Rather than try to interpret the literal value, we just
3361          collect it as a string.  Note that it's possible to have a
3362          floating point literal here.  The ABI specifies that the
3363          format of such literals is machine independent.  That's fine,
3364          but what's not fine is that versions of g++ up to 3.2 with
3365          -fabi-version=1 used upper case letters in the hex constant,
3366          and dumped out gcc's internal representation.  That makes it
3367          hard to tell where the constant ends, and hard to dump the
3368          constant in any readable form anyhow.  We don't attempt to
3369          handle these cases.  */
3370
3371       t = DEMANGLE_COMPONENT_LITERAL;
3372       if (d_peek_char (di) == 'n')
3373         {
3374           t = DEMANGLE_COMPONENT_LITERAL_NEG;
3375           d_advance (di, 1);
3376         }
3377       s = d_str (di);
3378       while (d_peek_char (di) != 'E')
3379         {
3380           if (d_peek_char (di) == '\0')
3381             return NULL;
3382           d_advance (di, 1);
3383         }
3384       ret = d_make_comp (di, t, type, d_make_name (di, s, d_str (di) - s));
3385     }
3386   if (! d_check_char (di, 'E'))
3387     return NULL;
3388   return ret;
3389 }
3390
3391 /* <local-name> ::= Z <(function) encoding> E <(entity) name> [<discriminator>]
3392                 ::= Z <(function) encoding> E s [<discriminator>]
3393                 ::= Z <(function) encoding> E d [<parameter> number>] _ <entity name>
3394 */
3395
3396 static struct demangle_component *
3397 d_local_name (struct d_info *di)
3398 {
3399   struct demangle_component *function;
3400
3401   if (! d_check_char (di, 'Z'))
3402     return NULL;
3403
3404   function = d_encoding (di, 0);
3405
3406   if (! d_check_char (di, 'E'))
3407     return NULL;
3408
3409   if (d_peek_char (di) == 's')
3410     {
3411       d_advance (di, 1);
3412       if (! d_discriminator (di))
3413         return NULL;
3414       return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function,
3415                           d_make_name (di, "string literal",
3416                                        sizeof "string literal" - 1));
3417     }
3418   else
3419     {
3420       struct demangle_component *name;
3421       int num = -1;
3422
3423       if (d_peek_char (di) == 'd')
3424         {
3425           /* Default argument scope: d <number> _.  */
3426           d_advance (di, 1);
3427           num = d_compact_number (di);
3428           if (num < 0)
3429             return NULL;
3430         }
3431
3432       name = d_name (di);
3433       if (name)
3434         switch (name->type)
3435           {
3436             /* Lambdas and unnamed types have internal discriminators.  */
3437           case DEMANGLE_COMPONENT_LAMBDA:
3438           case DEMANGLE_COMPONENT_UNNAMED_TYPE:
3439             break;
3440           default:
3441             if (! d_discriminator (di))
3442               return NULL;
3443           }
3444       if (num >= 0)
3445         name = d_make_default_arg (di, num, name);
3446       return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function, name);
3447     }
3448 }
3449
3450 /* <discriminator> ::= _ <(non-negative) number>
3451
3452    We demangle the discriminator, but we don't print it out.  FIXME:
3453    We should print it out in verbose mode.  */
3454
3455 static int
3456 d_discriminator (struct d_info *di)
3457 {
3458   long discrim;
3459
3460   if (d_peek_char (di) != '_')
3461     return 1;
3462   d_advance (di, 1);
3463   discrim = d_number (di);
3464   if (discrim < 0)
3465     return 0;
3466   return 1;
3467 }
3468
3469 /* <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _ */
3470
3471 static struct demangle_component *
3472 d_lambda (struct d_info *di)
3473 {
3474   struct demangle_component *tl;
3475   struct demangle_component *ret;
3476   int num;
3477
3478   if (! d_check_char (di, 'U'))
3479     return NULL;
3480   if (! d_check_char (di, 'l'))
3481     return NULL;
3482
3483   tl = d_parmlist (di);
3484   if (tl == NULL)
3485     return NULL;
3486
3487   if (! d_check_char (di, 'E'))
3488     return NULL;
3489
3490   num = d_compact_number (di);
3491   if (num < 0)
3492     return NULL;
3493
3494   ret = d_make_empty (di);
3495   if (ret)
3496     {
3497       ret->type = DEMANGLE_COMPONENT_LAMBDA;
3498       ret->u.s_unary_num.sub = tl;
3499       ret->u.s_unary_num.num = num;
3500     }
3501
3502   if (! d_add_substitution (di, ret))
3503     return NULL;
3504
3505   return ret;
3506 }
3507
3508 /* <unnamed-type-name> ::= Ut [ <nonnegative number> ] _ */
3509
3510 static struct demangle_component *
3511 d_unnamed_type (struct d_info *di)
3512 {
3513   struct demangle_component *ret;
3514   long num;
3515
3516   if (! d_check_char (di, 'U'))
3517     return NULL;
3518   if (! d_check_char (di, 't'))
3519     return NULL;
3520
3521   num = d_compact_number (di);
3522   if (num < 0)
3523     return NULL;
3524
3525   ret = d_make_empty (di);
3526   if (ret)
3527     {
3528       ret->type = DEMANGLE_COMPONENT_UNNAMED_TYPE;
3529       ret->u.s_number.number = num;
3530     }
3531
3532   if (! d_add_substitution (di, ret))
3533     return NULL;
3534
3535   return ret;
3536 }
3537
3538 /* <clone-suffix> ::= [ . <clone-type-identifier> ] [ . <nonnegative number> ]*
3539 */
3540
3541 static struct demangle_component *
3542 d_clone_suffix (struct d_info *di, struct demangle_component *encoding)
3543 {
3544   const char *suffix = d_str (di);
3545   const char *pend = suffix;
3546   struct demangle_component *n;
3547
3548   if (*pend == '.' && (IS_LOWER (pend[1]) || pend[1] == '_'))
3549     {
3550       pend += 2;
3551       while (IS_LOWER (*pend) || *pend == '_')
3552         ++pend;
3553     }
3554   while (*pend == '.' && IS_DIGIT (pend[1]))
3555     {
3556       pend += 2;
3557       while (IS_DIGIT (*pend))
3558         ++pend;
3559     }
3560   d_advance (di, pend - suffix);
3561   n = d_make_name (di, suffix, pend - suffix);
3562   return d_make_comp (di, DEMANGLE_COMPONENT_CLONE, encoding, n);
3563 }
3564
3565 /* Add a new substitution.  */
3566
3567 static int
3568 d_add_substitution (struct d_info *di, struct demangle_component *dc)
3569 {
3570   if (dc == NULL)
3571     return 0;
3572   if (di->next_sub >= di->num_subs)
3573     return 0;
3574   di->subs[di->next_sub] = dc;
3575   ++di->next_sub;
3576   return 1;
3577 }
3578
3579 /* <substitution> ::= S <seq-id> _
3580                   ::= S_
3581                   ::= St
3582                   ::= Sa
3583                   ::= Sb
3584                   ::= Ss
3585                   ::= Si
3586                   ::= So
3587                   ::= Sd
3588
3589    If PREFIX is non-zero, then this type is being used as a prefix in
3590    a qualified name.  In this case, for the standard substitutions, we
3591    need to check whether we are being used as a prefix for a
3592    constructor or destructor, and return a full template name.
3593    Otherwise we will get something like std::iostream::~iostream()
3594    which does not correspond particularly well to any function which
3595    actually appears in the source.
3596 */
3597
3598 static const struct d_standard_sub_info standard_subs[] =
3599 {
3600   { 't', NL ("std"),
3601     NL ("std"),
3602     NULL, 0 },
3603   { 'a', NL ("std::allocator"),
3604     NL ("std::allocator"),
3605     NL ("allocator") },
3606   { 'b', NL ("std::basic_string"),
3607     NL ("std::basic_string"),
3608     NL ("basic_string") },
3609   { 's', NL ("std::string"),
3610     NL ("std::basic_string<char, std::char_traits<char>, std::allocator<char> >"),
3611     NL ("basic_string") },
3612   { 'i', NL ("std::istream"),
3613     NL ("std::basic_istream<char, std::char_traits<char> >"),
3614     NL ("basic_istream") },
3615   { 'o', NL ("std::ostream"),
3616     NL ("std::basic_ostream<char, std::char_traits<char> >"),
3617     NL ("basic_ostream") },
3618   { 'd', NL ("std::iostream"),
3619     NL ("std::basic_iostream<char, std::char_traits<char> >"),
3620     NL ("basic_iostream") }
3621 };
3622
3623 static struct demangle_component *
3624 d_substitution (struct d_info *di, int prefix)
3625 {
3626   char c;
3627
3628   if (! d_check_char (di, 'S'))
3629     return NULL;
3630
3631   c = d_next_char (di);
3632   if (c == '_' || IS_DIGIT (c) || IS_UPPER (c))
3633     {
3634       unsigned int id;
3635
3636       id = 0;
3637       if (c != '_')
3638         {
3639           do
3640             {
3641               unsigned int new_id;
3642
3643               if (IS_DIGIT (c))
3644                 new_id = id * 36 + c - '0';
3645               else if (IS_UPPER (c))
3646                 new_id = id * 36 + c - 'A' + 10;
3647               else
3648                 return NULL;
3649               if (new_id < id)
3650                 return NULL;
3651               id = new_id;
3652               c = d_next_char (di);
3653             }
3654           while (c != '_');
3655
3656           ++id;
3657         }
3658
3659       if (id >= (unsigned int) di->next_sub)
3660         return NULL;
3661
3662       ++di->did_subs;
3663
3664       return di->subs[id];
3665     }
3666   else
3667     {
3668       int verbose;
3669       const struct d_standard_sub_info *p;
3670       const struct d_standard_sub_info *pend;
3671
3672       verbose = (di->options & DMGL_VERBOSE) != 0;
3673       if (! verbose && prefix)
3674         {
3675           char peek;
3676
3677           peek = d_peek_char (di);
3678           if (peek == 'C' || peek == 'D')
3679             verbose = 1;
3680         }
3681
3682       pend = (&standard_subs[0]
3683               + sizeof standard_subs / sizeof standard_subs[0]);
3684       for (p = &standard_subs[0]; p < pend; ++p)
3685         {
3686           if (c == p->code)
3687             {
3688               const char *s;
3689               int len;
3690               struct demangle_component *c;
3691
3692               if (p->set_last_name != NULL)
3693                 di->last_name = d_make_sub (di, p->set_last_name,
3694                                             p->set_last_name_len);
3695               if (verbose)
3696                 {
3697                   s = p->full_expansion;
3698                   len = p->full_len;
3699                 }
3700               else
3701                 {
3702                   s = p->simple_expansion;
3703                   len = p->simple_len;
3704                 }
3705               di->expansion += len;
3706               c = d_make_sub (di, s, len);
3707               if (d_peek_char (di) == 'B')
3708                 {
3709                   /* If there are ABI tags on the abbreviation, it becomes
3710                      a substitution candidate.  */
3711                   c = d_abi_tags (di, c);
3712                   d_add_substitution (di, c);
3713                 }
3714               return c;
3715             }
3716         }
3717
3718       return NULL;
3719     }
3720 }
3721
3722 static void
3723 d_checkpoint (struct d_info *di, struct d_info_checkpoint *checkpoint)
3724 {
3725   checkpoint->n = di->n;
3726   checkpoint->next_comp = di->next_comp;
3727   checkpoint->next_sub = di->next_sub;
3728   checkpoint->did_subs = di->did_subs;
3729   checkpoint->expansion = di->expansion;
3730 }
3731
3732 static void
3733 d_backtrack (struct d_info *di, struct d_info_checkpoint *checkpoint)
3734 {
3735   di->n = checkpoint->n;
3736   di->next_comp = checkpoint->next_comp;
3737   di->next_sub = checkpoint->next_sub;
3738   di->did_subs = checkpoint->did_subs;
3739   di->expansion = checkpoint->expansion;
3740 }
3741
3742 /* Initialize a growable string.  */
3743
3744 static void
3745 d_growable_string_init (struct d_growable_string *dgs, size_t estimate)
3746 {
3747   dgs->buf = NULL;
3748   dgs->len = 0;
3749   dgs->alc = 0;
3750   dgs->allocation_failure = 0;
3751
3752   if (estimate > 0)
3753     d_growable_string_resize (dgs, estimate);
3754 }
3755
3756 /* Grow a growable string to a given size.  */
3757
3758 static inline void
3759 d_growable_string_resize (struct d_growable_string *dgs, size_t need)
3760 {
3761   size_t newalc;
3762   char *newbuf;
3763
3764   if (dgs->allocation_failure)
3765     return;
3766
3767   /* Start allocation at two bytes to avoid any possibility of confusion
3768      with the special value of 1 used as a return in *palc to indicate
3769      allocation failures.  */
3770   newalc = dgs->alc > 0 ? dgs->alc : 2;
3771   while (newalc < need)
3772     newalc <<= 1;
3773
3774   newbuf = (char *) realloc (dgs->buf, newalc);
3775   if (newbuf == NULL)
3776     {
3777       free (dgs->buf);
3778       dgs->buf = NULL;
3779       dgs->len = 0;
3780       dgs->alc = 0;
3781       dgs->allocation_failure = 1;
3782       return;
3783     }
3784   dgs->buf = newbuf;
3785   dgs->alc = newalc;
3786 }
3787
3788 /* Append a buffer to a growable string.  */
3789
3790 static inline void
3791 d_growable_string_append_buffer (struct d_growable_string *dgs,
3792                                  const char *s, size_t l)
3793 {
3794   size_t need;
3795
3796   need = dgs->len + l + 1;
3797   if (need > dgs->alc)
3798     d_growable_string_resize (dgs, need);
3799
3800   if (dgs->allocation_failure)
3801     return;
3802
3803   memcpy (dgs->buf + dgs->len, s, l);
3804   dgs->buf[dgs->len + l] = '\0';
3805   dgs->len += l;
3806 }
3807
3808 /* Bridge growable strings to the callback mechanism.  */
3809
3810 static void
3811 d_growable_string_callback_adapter (const char *s, size_t l, void *opaque)
3812 {
3813   struct d_growable_string *dgs = (struct d_growable_string*) opaque;
3814
3815   d_growable_string_append_buffer (dgs, s, l);
3816 }
3817
3818 /* Walk the tree, counting the number of templates encountered, and
3819    the number of times a scope might be saved.  These counts will be
3820    used to allocate data structures for d_print_comp, so the logic
3821    here must mirror the logic d_print_comp will use.  It is not
3822    important that the resulting numbers are exact, so long as they
3823    are larger than the actual numbers encountered.  */
3824
3825 static void
3826 d_count_templates_scopes (int *num_templates, int *num_scopes,
3827                           const struct demangle_component *dc)
3828 {
3829   if (dc == NULL)
3830     return;
3831
3832   switch (dc->type)
3833     {
3834     case DEMANGLE_COMPONENT_NAME:
3835     case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
3836     case DEMANGLE_COMPONENT_FUNCTION_PARAM:
3837     case DEMANGLE_COMPONENT_SUB_STD:
3838     case DEMANGLE_COMPONENT_BUILTIN_TYPE:
3839     case DEMANGLE_COMPONENT_OPERATOR:
3840     case DEMANGLE_COMPONENT_CHARACTER:
3841     case DEMANGLE_COMPONENT_NUMBER:
3842     case DEMANGLE_COMPONENT_UNNAMED_TYPE:
3843       break;
3844
3845     case DEMANGLE_COMPONENT_TEMPLATE:
3846       (*num_templates)++;
3847       goto recurse_left_right;
3848
3849     case DEMANGLE_COMPONENT_REFERENCE:
3850     case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
3851       if (d_left (dc)->type == DEMANGLE_COMPONENT_TEMPLATE_PARAM)
3852         (*num_scopes)++;
3853       goto recurse_left_right;
3854
3855     case DEMANGLE_COMPONENT_QUAL_NAME:
3856     case DEMANGLE_COMPONENT_LOCAL_NAME:
3857     case DEMANGLE_COMPONENT_TYPED_NAME:
3858     case DEMANGLE_COMPONENT_VTABLE:
3859     case DEMANGLE_COMPONENT_VTT:
3860     case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
3861     case DEMANGLE_COMPONENT_TYPEINFO:
3862     case DEMANGLE_COMPONENT_TYPEINFO_NAME:
3863     case DEMANGLE_COMPONENT_TYPEINFO_FN:
3864     case DEMANGLE_COMPONENT_THUNK:
3865     case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
3866     case DEMANGLE_COMPONENT_COVARIANT_THUNK:
3867     case DEMANGLE_COMPONENT_JAVA_CLASS:
3868     case DEMANGLE_COMPONENT_GUARD:
3869     case DEMANGLE_COMPONENT_TLS_INIT:
3870     case DEMANGLE_COMPONENT_TLS_WRAPPER:
3871     case DEMANGLE_COMPONENT_REFTEMP:
3872     case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
3873     case DEMANGLE_COMPONENT_RESTRICT:
3874     case DEMANGLE_COMPONENT_VOLATILE:
3875     case DEMANGLE_COMPONENT_CONST:
3876     case DEMANGLE_COMPONENT_RESTRICT_THIS:
3877     case DEMANGLE_COMPONENT_VOLATILE_THIS:
3878     case DEMANGLE_COMPONENT_CONST_THIS:
3879     case DEMANGLE_COMPONENT_REFERENCE_THIS:
3880     case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
3881     case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
3882     case DEMANGLE_COMPONENT_POINTER:
3883     case DEMANGLE_COMPONENT_COMPLEX:
3884     case DEMANGLE_COMPONENT_IMAGINARY:
3885     case DEMANGLE_COMPONENT_VENDOR_TYPE:
3886     case DEMANGLE_COMPONENT_FUNCTION_TYPE:
3887     case DEMANGLE_COMPONENT_ARRAY_TYPE:
3888     case DEMANGLE_COMPONENT_PTRMEM_TYPE:
3889     case DEMANGLE_COMPONENT_VECTOR_TYPE:
3890     case DEMANGLE_COMPONENT_ARGLIST:
3891     case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
3892     case DEMANGLE_COMPONENT_INITIALIZER_LIST:
3893     case DEMANGLE_COMPONENT_CAST:
3894     case DEMANGLE_COMPONENT_NULLARY:
3895     case DEMANGLE_COMPONENT_UNARY:
3896     case DEMANGLE_COMPONENT_BINARY:
3897     case DEMANGLE_COMPONENT_BINARY_ARGS:
3898     case DEMANGLE_COMPONENT_TRINARY:
3899     case DEMANGLE_COMPONENT_TRINARY_ARG1:
3900     case DEMANGLE_COMPONENT_TRINARY_ARG2:
3901     case DEMANGLE_COMPONENT_LITERAL:
3902     case DEMANGLE_COMPONENT_LITERAL_NEG:
3903     case DEMANGLE_COMPONENT_JAVA_RESOURCE:
3904     case DEMANGLE_COMPONENT_COMPOUND_NAME:
3905     case DEMANGLE_COMPONENT_DECLTYPE:
3906     case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
3907     case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
3908     case DEMANGLE_COMPONENT_PACK_EXPANSION:
3909     case DEMANGLE_COMPONENT_TAGGED_NAME:
3910     case DEMANGLE_COMPONENT_CLONE:
3911     recurse_left_right:
3912       d_count_templates_scopes (num_templates, num_scopes,
3913                                 d_left (dc));
3914       d_count_templates_scopes (num_templates, num_scopes,
3915                                 d_right (dc));
3916       break;
3917
3918     case DEMANGLE_COMPONENT_CTOR:
3919       d_count_templates_scopes (num_templates, num_scopes,
3920                                 dc->u.s_ctor.name);
3921       break;
3922
3923     case DEMANGLE_COMPONENT_DTOR:
3924       d_count_templates_scopes (num_templates, num_scopes,
3925                                 dc->u.s_dtor.name);
3926       break;
3927
3928     case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
3929       d_count_templates_scopes (num_templates, num_scopes,
3930                                 dc->u.s_extended_operator.name);
3931       break;
3932
3933     case DEMANGLE_COMPONENT_FIXED_TYPE:
3934       d_count_templates_scopes (num_templates, num_scopes,
3935                                 dc->u.s_fixed.length);
3936       break;
3937
3938     case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
3939     case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
3940       d_count_templates_scopes (num_templates, num_scopes,
3941                                 d_left (dc));
3942       break;
3943
3944     case DEMANGLE_COMPONENT_LAMBDA:
3945     case DEMANGLE_COMPONENT_DEFAULT_ARG:
3946       d_count_templates_scopes (num_templates, num_scopes,
3947                                 dc->u.s_unary_num.sub);
3948       break;
3949     }
3950 }
3951
3952 /* Initialize a print information structure.  */
3953
3954 static void
3955 d_print_init (struct d_print_info *dpi, demangle_callbackref callback,
3956               void *opaque, const struct demangle_component *dc)
3957 {
3958   dpi->len = 0;
3959   dpi->last_char = '\0';
3960   dpi->templates = NULL;
3961   dpi->modifiers = NULL;
3962   dpi->pack_index = 0;
3963   dpi->flush_count = 0;
3964
3965   dpi->callback = callback;
3966   dpi->opaque = opaque;
3967
3968   dpi->demangle_failure = 0;
3969
3970   dpi->component_stack = NULL;
3971
3972   dpi->saved_scopes = NULL;
3973   dpi->next_saved_scope = 0;
3974   dpi->num_saved_scopes = 0;
3975
3976   dpi->copy_templates = NULL;
3977   dpi->next_copy_template = 0;
3978   dpi->num_copy_templates = 0;
3979
3980   d_count_templates_scopes (&dpi->num_copy_templates,
3981                             &dpi->num_saved_scopes, dc);
3982   dpi->num_copy_templates *= dpi->num_saved_scopes;
3983
3984   dpi->current_template = NULL;
3985 }
3986
3987 /* Indicate that an error occurred during printing, and test for error.  */
3988
3989 static inline void
3990 d_print_error (struct d_print_info *dpi)
3991 {
3992   dpi->demangle_failure = 1;
3993 }
3994
3995 static inline int
3996 d_print_saw_error (struct d_print_info *dpi)
3997 {
3998   return dpi->demangle_failure != 0;
3999 }
4000
4001 /* Flush buffered characters to the callback.  */
4002
4003 static inline void
4004 d_print_flush (struct d_print_info *dpi)
4005 {
4006   dpi->buf[dpi->len] = '\0';
4007   dpi->callback (dpi->buf, dpi->len, dpi->opaque);
4008   dpi->len = 0;
4009   dpi->flush_count++;
4010 }
4011
4012 /* Append characters and buffers for printing.  */
4013
4014 static inline void
4015 d_append_char (struct d_print_info *dpi, char c)
4016 {
4017   if (dpi->len == sizeof (dpi->buf) - 1)
4018     d_print_flush (dpi);
4019
4020   dpi->buf[dpi->len++] = c;
4021   dpi->last_char = c;
4022 }
4023
4024 static inline void
4025 d_append_buffer (struct d_print_info *dpi, const char *s, size_t l)
4026 {
4027   size_t i;
4028
4029   for (i = 0; i < l; i++)
4030     d_append_char (dpi, s[i]);
4031 }
4032
4033 static inline void
4034 d_append_string (struct d_print_info *dpi, const char *s)
4035 {
4036   d_append_buffer (dpi, s, strlen (s));
4037 }
4038
4039 static inline void
4040 d_append_num (struct d_print_info *dpi, long l)
4041 {
4042   char buf[25];
4043   sprintf (buf,"%ld", l);
4044   d_append_string (dpi, buf);
4045 }
4046
4047 static inline char
4048 d_last_char (struct d_print_info *dpi)
4049 {
4050   return dpi->last_char;
4051 }
4052
4053 /* Turn components into a human readable string.  OPTIONS is the
4054    options bits passed to the demangler.  DC is the tree to print.
4055    CALLBACK is a function to call to flush demangled string segments
4056    as they fill the intermediate buffer, and OPAQUE is a generalized
4057    callback argument.  On success, this returns 1.  On failure,
4058    it returns 0, indicating a bad parse.  It does not use heap
4059    memory to build an output string, so cannot encounter memory
4060    allocation failure.  */
4061
4062 CP_STATIC_IF_GLIBCPP_V3
4063 int
4064 cplus_demangle_print_callback (int options,
4065                                const struct demangle_component *dc,
4066                                demangle_callbackref callback, void *opaque)
4067 {
4068   struct d_print_info dpi;
4069
4070   d_print_init (&dpi, callback, opaque, dc);
4071
4072   {
4073 #ifdef CP_DYNAMIC_ARRAYS
4074     __extension__ struct d_saved_scope scopes[dpi.num_saved_scopes];
4075     __extension__ struct d_print_template temps[dpi.num_copy_templates];
4076
4077     dpi.saved_scopes = scopes;
4078     dpi.copy_templates = temps;
4079 #else
4080     dpi.saved_scopes = alloca (dpi.num_saved_scopes
4081                                * sizeof (*dpi.saved_scopes));
4082     dpi.copy_templates = alloca (dpi.num_copy_templates
4083                                  * sizeof (*dpi.copy_templates));
4084 #endif
4085
4086     d_print_comp (&dpi, options, dc);
4087   }
4088
4089   d_print_flush (&dpi);
4090
4091   return ! d_print_saw_error (&dpi);
4092 }
4093
4094 /* Turn components into a human readable string.  OPTIONS is the
4095    options bits passed to the demangler.  DC is the tree to print.
4096    ESTIMATE is a guess at the length of the result.  This returns a
4097    string allocated by malloc, or NULL on error.  On success, this
4098    sets *PALC to the size of the allocated buffer.  On failure, this
4099    sets *PALC to 0 for a bad parse, or to 1 for a memory allocation
4100    failure.  */
4101
4102 CP_STATIC_IF_GLIBCPP_V3
4103 char *
4104 cplus_demangle_print (int options, const struct demangle_component *dc,
4105                       int estimate, size_t *palc)
4106 {
4107   struct d_growable_string dgs;
4108
4109   d_growable_string_init (&dgs, estimate);
4110
4111   if (! cplus_demangle_print_callback (options, dc,
4112                                        d_growable_string_callback_adapter,
4113                                        &dgs))
4114     {
4115       free (dgs.buf);
4116       *palc = 0;
4117       return NULL;
4118     }
4119
4120   *palc = dgs.allocation_failure ? 1 : dgs.alc;
4121   return dgs.buf;
4122 }
4123
4124 /* Returns the I'th element of the template arglist ARGS, or NULL on
4125    failure.  */
4126
4127 static struct demangle_component *
4128 d_index_template_argument (struct demangle_component *args, int i)
4129 {
4130   struct demangle_component *a;
4131
4132   for (a = args;
4133        a != NULL;
4134        a = d_right (a))
4135     {
4136       if (a->type != DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4137         return NULL;
4138       if (i <= 0)
4139         break;
4140       --i;
4141     }
4142   if (i != 0 || a == NULL)
4143     return NULL;
4144
4145   return d_left (a);
4146 }
4147
4148 /* Returns the template argument from the current context indicated by DC,
4149    which is a DEMANGLE_COMPONENT_TEMPLATE_PARAM, or NULL.  */
4150
4151 static struct demangle_component *
4152 d_lookup_template_argument (struct d_print_info *dpi,
4153                             const struct demangle_component *dc)
4154 {
4155   if (dpi->templates == NULL)
4156     {
4157       d_print_error (dpi);
4158       return NULL;
4159     }
4160         
4161   return d_index_template_argument
4162     (d_right (dpi->templates->template_decl),
4163      dc->u.s_number.number);
4164 }
4165
4166 /* Returns a template argument pack used in DC (any will do), or NULL.  */
4167
4168 static struct demangle_component *
4169 d_find_pack (struct d_print_info *dpi,
4170              const struct demangle_component *dc)
4171 {
4172   struct demangle_component *a;
4173   if (dc == NULL)
4174     return NULL;
4175
4176   switch (dc->type)
4177     {
4178     case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
4179       a = d_lookup_template_argument (dpi, dc);
4180       if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4181         return a;
4182       return NULL;
4183
4184     case DEMANGLE_COMPONENT_PACK_EXPANSION:
4185       return NULL;
4186       
4187     case DEMANGLE_COMPONENT_LAMBDA:
4188     case DEMANGLE_COMPONENT_NAME:
4189     case DEMANGLE_COMPONENT_TAGGED_NAME:
4190     case DEMANGLE_COMPONENT_OPERATOR:
4191     case DEMANGLE_COMPONENT_BUILTIN_TYPE:
4192     case DEMANGLE_COMPONENT_SUB_STD:
4193     case DEMANGLE_COMPONENT_CHARACTER:
4194     case DEMANGLE_COMPONENT_FUNCTION_PARAM:
4195     case DEMANGLE_COMPONENT_UNNAMED_TYPE:
4196       return NULL;
4197
4198     case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
4199       return d_find_pack (dpi, dc->u.s_extended_operator.name);
4200     case DEMANGLE_COMPONENT_CTOR:
4201       return d_find_pack (dpi, dc->u.s_ctor.name);
4202     case DEMANGLE_COMPONENT_DTOR:
4203       return d_find_pack (dpi, dc->u.s_dtor.name);
4204
4205     default:
4206       a = d_find_pack (dpi, d_left (dc));
4207       if (a)
4208         return a;
4209       return d_find_pack (dpi, d_right (dc));
4210     }
4211 }
4212
4213 /* Returns the length of the template argument pack DC.  */
4214
4215 static int
4216 d_pack_length (const struct demangle_component *dc)
4217 {
4218   int count = 0;
4219   while (dc && dc->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
4220          && d_left (dc) != NULL)
4221     {
4222       ++count;
4223       dc = d_right (dc);
4224     }
4225   return count;
4226 }
4227
4228 /* DC is a component of a mangled expression.  Print it, wrapped in parens
4229    if needed.  */
4230
4231 static void
4232 d_print_subexpr (struct d_print_info *dpi, int options,
4233                  const struct demangle_component *dc)
4234 {
4235   int simple = 0;
4236   if (dc->type == DEMANGLE_COMPONENT_NAME
4237       || dc->type == DEMANGLE_COMPONENT_QUAL_NAME
4238       || dc->type == DEMANGLE_COMPONENT_INITIALIZER_LIST
4239       || dc->type == DEMANGLE_COMPONENT_FUNCTION_PARAM)
4240     simple = 1;
4241   if (!simple)
4242     d_append_char (dpi, '(');
4243   d_print_comp (dpi, options, dc);
4244   if (!simple)
4245     d_append_char (dpi, ')');
4246 }
4247
4248 /* Save the current scope.  */
4249
4250 static void
4251 d_save_scope (struct d_print_info *dpi,
4252               const struct demangle_component *container)
4253 {
4254   struct d_saved_scope *scope;
4255   struct d_print_template *src, **link;
4256
4257   if (dpi->next_saved_scope >= dpi->num_saved_scopes)
4258     {
4259       d_print_error (dpi);
4260       return;
4261     }
4262   scope = &dpi->saved_scopes[dpi->next_saved_scope];
4263   dpi->next_saved_scope++;
4264
4265   scope->container = container;
4266   link = &scope->templates;
4267
4268   for (src = dpi->templates; src != NULL; src = src->next)
4269     {
4270       struct d_print_template *dst;
4271
4272       if (dpi->next_copy_template >= dpi->num_copy_templates)
4273         {
4274           d_print_error (dpi);
4275           return;
4276         }
4277       dst = &dpi->copy_templates[dpi->next_copy_template];
4278       dpi->next_copy_template++;
4279
4280       dst->template_decl = src->template_decl;
4281       *link = dst;
4282       link = &dst->next;
4283     }
4284
4285   *link = NULL;
4286 }
4287
4288 /* Attempt to locate a previously saved scope.  Returns NULL if no
4289    corresponding saved scope was found.  */
4290
4291 static struct d_saved_scope *
4292 d_get_saved_scope (struct d_print_info *dpi,
4293                    const struct demangle_component *container)
4294 {
4295   int i;
4296
4297   for (i = 0; i < dpi->next_saved_scope; i++)
4298     if (dpi->saved_scopes[i].container == container)
4299       return &dpi->saved_scopes[i];
4300
4301   return NULL;
4302 }
4303
4304 /* Subroutine to handle components.  */
4305
4306 static void
4307 d_print_comp_inner (struct d_print_info *dpi, int options,
4308                   const struct demangle_component *dc)
4309 {
4310   /* Magic variable to let reference smashing skip over the next modifier
4311      without needing to modify *dc.  */
4312   const struct demangle_component *mod_inner = NULL;
4313
4314   /* Variable used to store the current templates while a previously
4315      captured scope is used.  */
4316   struct d_print_template *saved_templates;
4317
4318   /* Nonzero if templates have been stored in the above variable.  */
4319   int need_template_restore = 0;
4320
4321   if (dc == NULL)
4322     {
4323       d_print_error (dpi);
4324       return;
4325     }
4326   if (d_print_saw_error (dpi))
4327     return;
4328
4329   switch (dc->type)
4330     {
4331     case DEMANGLE_COMPONENT_NAME:
4332       if ((options & DMGL_JAVA) == 0)
4333         d_append_buffer (dpi, dc->u.s_name.s, dc->u.s_name.len);
4334       else
4335         d_print_java_identifier (dpi, dc->u.s_name.s, dc->u.s_name.len);
4336       return;
4337
4338     case DEMANGLE_COMPONENT_TAGGED_NAME:
4339       d_print_comp (dpi, options, d_left (dc));
4340       d_append_string (dpi, "[abi:");
4341       d_print_comp (dpi, options, d_right (dc));
4342       d_append_char (dpi, ']');
4343       return;
4344
4345     case DEMANGLE_COMPONENT_QUAL_NAME:
4346     case DEMANGLE_COMPONENT_LOCAL_NAME:
4347       d_print_comp (dpi, options, d_left (dc));
4348       if ((options & DMGL_JAVA) == 0)
4349         d_append_string (dpi, "::");
4350       else
4351         d_append_char (dpi, '.');
4352       {
4353         struct demangle_component *local_name = d_right (dc);
4354         if (local_name->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
4355           {
4356             d_append_string (dpi, "{default arg#");
4357             d_append_num (dpi, local_name->u.s_unary_num.num + 1);
4358             d_append_string (dpi, "}::");
4359             local_name = local_name->u.s_unary_num.sub;
4360           }
4361         d_print_comp (dpi, options, local_name);
4362       }
4363       return;
4364
4365     case DEMANGLE_COMPONENT_TYPED_NAME:
4366       {
4367         struct d_print_mod *hold_modifiers;
4368         struct demangle_component *typed_name;
4369         struct d_print_mod adpm[4];
4370         unsigned int i;
4371         struct d_print_template dpt;
4372
4373         /* Pass the name down to the type so that it can be printed in
4374            the right place for the type.  We also have to pass down
4375            any CV-qualifiers, which apply to the this parameter.  */
4376         hold_modifiers = dpi->modifiers;
4377         dpi->modifiers = 0;
4378         i = 0;
4379         typed_name = d_left (dc);
4380         while (typed_name != NULL)
4381           {
4382             if (i >= sizeof adpm / sizeof adpm[0])
4383               {
4384                 d_print_error (dpi);
4385                 return;
4386               }
4387
4388             adpm[i].next = dpi->modifiers;
4389             dpi->modifiers = &adpm[i];
4390             adpm[i].mod = typed_name;
4391             adpm[i].printed = 0;
4392             adpm[i].templates = dpi->templates;
4393             ++i;
4394
4395             if (typed_name->type != DEMANGLE_COMPONENT_RESTRICT_THIS
4396                 && typed_name->type != DEMANGLE_COMPONENT_VOLATILE_THIS
4397                 && typed_name->type != DEMANGLE_COMPONENT_CONST_THIS
4398                 && typed_name->type != DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
4399                 && typed_name->type != DEMANGLE_COMPONENT_REFERENCE_THIS)
4400               break;
4401
4402             typed_name = d_left (typed_name);
4403           }
4404
4405         if (typed_name == NULL)
4406           {
4407             d_print_error (dpi);
4408             return;
4409           }
4410
4411         /* If typed_name is a template, then it applies to the
4412            function type as well.  */
4413         if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
4414           {
4415             dpt.next = dpi->templates;
4416             dpi->templates = &dpt;
4417             dpt.template_decl = typed_name;
4418           }
4419
4420         /* If typed_name is a DEMANGLE_COMPONENT_LOCAL_NAME, then
4421            there may be CV-qualifiers on its right argument which
4422            really apply here; this happens when parsing a class which
4423            is local to a function.  */
4424         if (typed_name->type == DEMANGLE_COMPONENT_LOCAL_NAME)
4425           {
4426             struct demangle_component *local_name;
4427
4428             local_name = d_right (typed_name);
4429             if (local_name->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
4430               local_name = local_name->u.s_unary_num.sub;
4431             while (local_name->type == DEMANGLE_COMPONENT_RESTRICT_THIS
4432                    || local_name->type == DEMANGLE_COMPONENT_VOLATILE_THIS
4433                    || local_name->type == DEMANGLE_COMPONENT_CONST_THIS
4434                    || local_name->type == DEMANGLE_COMPONENT_REFERENCE_THIS
4435                    || (local_name->type
4436                        == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS))
4437               {
4438                 if (i >= sizeof adpm / sizeof adpm[0])
4439                   {
4440                     d_print_error (dpi);
4441                     return;
4442                   }
4443
4444                 adpm[i] = adpm[i - 1];
4445                 adpm[i].next = &adpm[i - 1];
4446                 dpi->modifiers = &adpm[i];
4447
4448                 adpm[i - 1].mod = local_name;
4449                 adpm[i - 1].printed = 0;
4450                 adpm[i - 1].templates = dpi->templates;
4451                 ++i;
4452
4453                 local_name = d_left (local_name);
4454               }
4455           }
4456
4457         d_print_comp (dpi, options, d_right (dc));
4458
4459         if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
4460           dpi->templates = dpt.next;
4461
4462         /* If the modifiers didn't get printed by the type, print them
4463            now.  */
4464         while (i > 0)
4465           {
4466             --i;
4467             if (! adpm[i].printed)
4468               {
4469                 d_append_char (dpi, ' ');
4470                 d_print_mod (dpi, options, adpm[i].mod);
4471               }
4472           }
4473
4474         dpi->modifiers = hold_modifiers;
4475
4476         return;
4477       }
4478
4479     case DEMANGLE_COMPONENT_TEMPLATE:
4480       {
4481         struct d_print_mod *hold_dpm;
4482         struct demangle_component *dcl;
4483         const struct demangle_component *hold_current;
4484
4485         /* This template may need to be referenced by a cast operator
4486            contained in its subtree.  */
4487         hold_current = dpi->current_template;
4488         dpi->current_template = dc;
4489
4490         /* Don't push modifiers into a template definition.  Doing so
4491            could give the wrong definition for a template argument.
4492            Instead, treat the template essentially as a name.  */
4493
4494         hold_dpm = dpi->modifiers;
4495         dpi->modifiers = NULL;
4496
4497         dcl = d_left (dc);
4498
4499         if ((options & DMGL_JAVA) != 0
4500             && dcl->type == DEMANGLE_COMPONENT_NAME
4501             && dcl->u.s_name.len == 6
4502             && strncmp (dcl->u.s_name.s, "JArray", 6) == 0)
4503           {
4504             /* Special-case Java arrays, so that JArray<TYPE> appears
4505                instead as TYPE[].  */
4506
4507             d_print_comp (dpi, options, d_right (dc));
4508             d_append_string (dpi, "[]");
4509           }
4510         else
4511           {
4512             d_print_comp (dpi, options, dcl);
4513             if (d_last_char (dpi) == '<')
4514               d_append_char (dpi, ' ');
4515             d_append_char (dpi, '<');
4516             d_print_comp (dpi, options, d_right (dc));
4517             /* Avoid generating two consecutive '>' characters, to avoid
4518                the C++ syntactic ambiguity.  */
4519             if (d_last_char (dpi) == '>')
4520               d_append_char (dpi, ' ');
4521             d_append_char (dpi, '>');
4522           }
4523
4524         dpi->modifiers = hold_dpm;
4525         dpi->current_template = hold_current;
4526
4527         return;
4528       }
4529
4530     case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
4531       {
4532         struct d_print_template *hold_dpt;
4533         struct demangle_component *a = d_lookup_template_argument (dpi, dc);
4534
4535         if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4536           a = d_index_template_argument (a, dpi->pack_index);
4537
4538         if (a == NULL)
4539           {
4540             d_print_error (dpi);
4541             return;
4542           }
4543
4544         /* While processing this parameter, we need to pop the list of
4545            templates.  This is because the template parameter may
4546            itself be a reference to a parameter of an outer
4547            template.  */
4548
4549         hold_dpt = dpi->templates;
4550         dpi->templates = hold_dpt->next;
4551
4552         d_print_comp (dpi, options, a);
4553
4554         dpi->templates = hold_dpt;
4555
4556         return;
4557       }
4558
4559     case DEMANGLE_COMPONENT_CTOR:
4560       d_print_comp (dpi, options, dc->u.s_ctor.name);
4561       return;
4562
4563     case DEMANGLE_COMPONENT_DTOR:
4564       d_append_char (dpi, '~');
4565       d_print_comp (dpi, options, dc->u.s_dtor.name);
4566       return;
4567
4568     case DEMANGLE_COMPONENT_VTABLE:
4569       d_append_string (dpi, "vtable for ");
4570       d_print_comp (dpi, options, d_left (dc));
4571       return;
4572
4573     case DEMANGLE_COMPONENT_VTT:
4574       d_append_string (dpi, "VTT for ");
4575       d_print_comp (dpi, options, d_left (dc));
4576       return;
4577
4578     case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
4579       d_append_string (dpi, "construction vtable for ");
4580       d_print_comp (dpi, options, d_left (dc));
4581       d_append_string (dpi, "-in-");
4582       d_print_comp (dpi, options, d_right (dc));
4583       return;
4584
4585     case DEMANGLE_COMPONENT_TYPEINFO:
4586       d_append_string (dpi, "typeinfo for ");
4587       d_print_comp (dpi, options, d_left (dc));
4588       return;
4589
4590     case DEMANGLE_COMPONENT_TYPEINFO_NAME:
4591       d_append_string (dpi, "typeinfo name for ");
4592       d_print_comp (dpi, options, d_left (dc));
4593       return;
4594
4595     case DEMANGLE_COMPONENT_TYPEINFO_FN:
4596       d_append_string (dpi, "typeinfo fn for ");
4597       d_print_comp (dpi, options, d_left (dc));
4598       return;
4599
4600     case DEMANGLE_COMPONENT_THUNK:
4601       d_append_string (dpi, "non-virtual thunk to ");
4602       d_print_comp (dpi, options, d_left (dc));
4603       return;
4604
4605     case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
4606       d_append_string (dpi, "virtual thunk to ");
4607       d_print_comp (dpi, options, d_left (dc));
4608       return;
4609
4610     case DEMANGLE_COMPONENT_COVARIANT_THUNK:
4611       d_append_string (dpi, "covariant return thunk to ");
4612       d_print_comp (dpi, options, d_left (dc));
4613       return;
4614
4615     case DEMANGLE_COMPONENT_JAVA_CLASS:
4616       d_append_string (dpi, "java Class for ");
4617       d_print_comp (dpi, options, d_left (dc));
4618       return;
4619
4620     case DEMANGLE_COMPONENT_GUARD:
4621       d_append_string (dpi, "guard variable for ");
4622       d_print_comp (dpi, options, d_left (dc));
4623       return;
4624
4625     case DEMANGLE_COMPONENT_TLS_INIT:
4626       d_append_string (dpi, "TLS init function for ");
4627       d_print_comp (dpi, options, d_left (dc));
4628       return;
4629
4630     case DEMANGLE_COMPONENT_TLS_WRAPPER:
4631       d_append_string (dpi, "TLS wrapper function for ");
4632       d_print_comp (dpi, options, d_left (dc));
4633       return;
4634
4635     case DEMANGLE_COMPONENT_REFTEMP:
4636       d_append_string (dpi, "reference temporary #");
4637       d_print_comp (dpi, options, d_right (dc));
4638       d_append_string (dpi, " for ");
4639       d_print_comp (dpi, options, d_left (dc));
4640       return;
4641
4642     case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
4643       d_append_string (dpi, "hidden alias for ");
4644       d_print_comp (dpi, options, d_left (dc));
4645       return;
4646
4647     case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
4648       d_append_string (dpi, "transaction clone for ");
4649       d_print_comp (dpi, options, d_left (dc));
4650       return;
4651
4652     case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
4653       d_append_string (dpi, "non-transaction clone for ");
4654       d_print_comp (dpi, options, d_left (dc));
4655       return;
4656
4657     case DEMANGLE_COMPONENT_SUB_STD:
4658       d_append_buffer (dpi, dc->u.s_string.string, dc->u.s_string.len);
4659       return;
4660
4661     case DEMANGLE_COMPONENT_RESTRICT:
4662     case DEMANGLE_COMPONENT_VOLATILE:
4663     case DEMANGLE_COMPONENT_CONST:
4664       {
4665         struct d_print_mod *pdpm;
4666
4667         /* When printing arrays, it's possible to have cases where the
4668            same CV-qualifier gets pushed on the stack multiple times.
4669            We only need to print it once.  */
4670
4671         for (pdpm = dpi->modifiers; pdpm != NULL; pdpm = pdpm->next)
4672           {
4673             if (! pdpm->printed)
4674               {
4675                 if (pdpm->mod->type != DEMANGLE_COMPONENT_RESTRICT
4676                     && pdpm->mod->type != DEMANGLE_COMPONENT_VOLATILE
4677                     && pdpm->mod->type != DEMANGLE_COMPONENT_CONST)
4678                   break;
4679                 if (pdpm->mod->type == dc->type)
4680                   {
4681                     d_print_comp (dpi, options, d_left (dc));
4682                     return;
4683                   }
4684               }
4685           }
4686       }
4687       goto modifier;
4688
4689     case DEMANGLE_COMPONENT_REFERENCE:
4690     case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
4691       {
4692         /* Handle reference smashing: & + && = &.  */
4693         const struct demangle_component *sub = d_left (dc);
4694         if (sub->type == DEMANGLE_COMPONENT_TEMPLATE_PARAM)
4695           {
4696             struct d_saved_scope *scope = d_get_saved_scope (dpi, sub);
4697             struct demangle_component *a;
4698
4699             if (scope == NULL)
4700               {
4701                 /* This is the first time SUB has been traversed.
4702                    We need to capture the current templates so
4703                    they can be restored if SUB is reentered as a
4704                    substitution.  */
4705                 d_save_scope (dpi, sub);
4706                 if (d_print_saw_error (dpi))
4707                   return;
4708               }
4709             else
4710               {
4711                 const struct d_component_stack *dcse;
4712                 int found_self_or_parent = 0;
4713
4714                 /* This traversal is reentering SUB as a substition.
4715                    If we are not beneath SUB or DC in the tree then we
4716                    need to restore SUB's template stack temporarily.  */
4717                 for (dcse = dpi->component_stack; dcse != NULL;
4718                      dcse = dcse->parent)
4719                   {
4720                     if (dcse->dc == sub
4721                         || (dcse->dc == dc
4722                             && dcse != dpi->component_stack))
4723                       {
4724                         found_self_or_parent = 1;
4725                         break;
4726                       }
4727                   }
4728
4729                 if (!found_self_or_parent)
4730                   {
4731                     saved_templates = dpi->templates;
4732                     dpi->templates = scope->templates;
4733                     need_template_restore = 1;
4734                   }
4735               }
4736
4737             a = d_lookup_template_argument (dpi, sub);
4738             if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4739               a = d_index_template_argument (a, dpi->pack_index);
4740
4741             if (a == NULL)
4742               {
4743                 if (need_template_restore)
4744                   dpi->templates = saved_templates;
4745
4746                 d_print_error (dpi);
4747                 return;
4748               }
4749
4750             sub = a;
4751           }
4752
4753         if (sub->type == DEMANGLE_COMPONENT_REFERENCE
4754             || sub->type == dc->type)
4755           dc = sub;
4756         else if (sub->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE)
4757           mod_inner = d_left (sub);
4758       }
4759       /* Fall through.  */
4760
4761     case DEMANGLE_COMPONENT_RESTRICT_THIS:
4762     case DEMANGLE_COMPONENT_VOLATILE_THIS:
4763     case DEMANGLE_COMPONENT_CONST_THIS:
4764     case DEMANGLE_COMPONENT_REFERENCE_THIS:
4765     case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
4766     case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
4767     case DEMANGLE_COMPONENT_POINTER:
4768     case DEMANGLE_COMPONENT_COMPLEX:
4769     case DEMANGLE_COMPONENT_IMAGINARY:
4770     modifier:
4771       {
4772         /* We keep a list of modifiers on the stack.  */
4773         struct d_print_mod dpm;
4774
4775         dpm.next = dpi->modifiers;
4776         dpi->modifiers = &dpm;
4777         dpm.mod = dc;
4778         dpm.printed = 0;
4779         dpm.templates = dpi->templates;
4780
4781         if (!mod_inner)
4782           mod_inner = d_left (dc);
4783
4784         d_print_comp (dpi, options, mod_inner);
4785
4786         /* If the modifier didn't get printed by the type, print it
4787            now.  */
4788         if (! dpm.printed)
4789           d_print_mod (dpi, options, dc);
4790
4791         dpi->modifiers = dpm.next;
4792
4793         if (need_template_restore)
4794           dpi->templates = saved_templates;
4795
4796         return;
4797       }
4798
4799     case DEMANGLE_COMPONENT_BUILTIN_TYPE:
4800       if ((options & DMGL_JAVA) == 0)
4801         d_append_buffer (dpi, dc->u.s_builtin.type->name,
4802                          dc->u.s_builtin.type->len);
4803       else
4804         d_append_buffer (dpi, dc->u.s_builtin.type->java_name,
4805                          dc->u.s_builtin.type->java_len);
4806       return;
4807
4808     case DEMANGLE_COMPONENT_VENDOR_TYPE:
4809       d_print_comp (dpi, options, d_left (dc));
4810       return;
4811
4812     case DEMANGLE_COMPONENT_FUNCTION_TYPE:
4813       {
4814         if ((options & DMGL_RET_POSTFIX) != 0)
4815           d_print_function_type (dpi,
4816                                  options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
4817                                  dc, dpi->modifiers);
4818
4819         /* Print return type if present */
4820         if (d_left (dc) != NULL && (options & DMGL_RET_POSTFIX) != 0)
4821           d_print_comp (dpi, options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
4822                         d_left (dc));
4823         else if (d_left (dc) != NULL && (options & DMGL_RET_DROP) == 0)
4824           {
4825             struct d_print_mod dpm;
4826
4827             /* We must pass this type down as a modifier in order to
4828                print it in the right location.  */
4829             dpm.next = dpi->modifiers;
4830             dpi->modifiers = &dpm;
4831             dpm.mod = dc;
4832             dpm.printed = 0;
4833             dpm.templates = dpi->templates;
4834
4835             d_print_comp (dpi, options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
4836                           d_left (dc));
4837
4838             dpi->modifiers = dpm.next;
4839
4840             if (dpm.printed)
4841               return;
4842
4843             /* In standard prefix notation, there is a space between the
4844                return type and the function signature.  */
4845             if ((options & DMGL_RET_POSTFIX) == 0)
4846               d_append_char (dpi, ' ');
4847           }
4848
4849         if ((options & DMGL_RET_POSTFIX) == 0)
4850           d_print_function_type (dpi,
4851                                  options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
4852                                  dc, dpi->modifiers);
4853
4854         return;
4855       }
4856
4857     case DEMANGLE_COMPONENT_ARRAY_TYPE:
4858       {
4859         struct d_print_mod *hold_modifiers;
4860         struct d_print_mod adpm[4];
4861         unsigned int i;
4862         struct d_print_mod *pdpm;
4863
4864         /* We must pass this type down as a modifier in order to print
4865            multi-dimensional arrays correctly.  If the array itself is
4866            CV-qualified, we act as though the element type were
4867            CV-qualified.  We do this by copying the modifiers down
4868            rather than fiddling pointers, so that we don't wind up
4869            with a d_print_mod higher on the stack pointing into our
4870            stack frame after we return.  */
4871
4872         hold_modifiers = dpi->modifiers;
4873
4874         adpm[0].next = hold_modifiers;
4875         dpi->modifiers = &adpm[0];
4876         adpm[0].mod = dc;
4877         adpm[0].printed = 0;
4878         adpm[0].templates = dpi->templates;
4879
4880         i = 1;
4881         pdpm = hold_modifiers;
4882         while (pdpm != NULL
4883                && (pdpm->mod->type == DEMANGLE_COMPONENT_RESTRICT
4884                    || pdpm->mod->type == DEMANGLE_COMPONENT_VOLATILE
4885                    || pdpm->mod->type == DEMANGLE_COMPONENT_CONST))
4886           {
4887             if (! pdpm->printed)
4888               {
4889                 if (i >= sizeof adpm / sizeof adpm[0])
4890                   {
4891                     d_print_error (dpi);
4892                     return;
4893                   }
4894
4895                 adpm[i] = *pdpm;
4896                 adpm[i].next = dpi->modifiers;
4897                 dpi->modifiers = &adpm[i];
4898                 pdpm->printed = 1;
4899                 ++i;
4900               }
4901
4902             pdpm = pdpm->next;
4903           }
4904
4905         d_print_comp (dpi, options, d_right (dc));
4906
4907         dpi->modifiers = hold_modifiers;
4908
4909         if (adpm[0].printed)
4910           return;
4911
4912         while (i > 1)
4913           {
4914             --i;
4915             d_print_mod (dpi, options, adpm[i].mod);
4916           }
4917
4918         d_print_array_type (dpi, options, dc, dpi->modifiers);
4919
4920         return;
4921       }
4922
4923     case DEMANGLE_COMPONENT_PTRMEM_TYPE:
4924     case DEMANGLE_COMPONENT_VECTOR_TYPE:
4925       {
4926         struct d_print_mod dpm;
4927
4928         dpm.next = dpi->modifiers;
4929         dpi->modifiers = &dpm;
4930         dpm.mod = dc;
4931         dpm.printed = 0;
4932         dpm.templates = dpi->templates;
4933
4934         d_print_comp (dpi, options, d_right (dc));
4935
4936         /* If the modifier didn't get printed by the type, print it
4937            now.  */
4938         if (! dpm.printed)
4939           d_print_mod (dpi, options, dc);
4940
4941         dpi->modifiers = dpm.next;
4942
4943         return;
4944       }
4945
4946     case DEMANGLE_COMPONENT_FIXED_TYPE:
4947       if (dc->u.s_fixed.sat)
4948         d_append_string (dpi, "_Sat ");
4949       /* Don't print "int _Accum".  */
4950       if (dc->u.s_fixed.length->u.s_builtin.type
4951           != &cplus_demangle_builtin_types['i'-'a'])
4952         {
4953           d_print_comp (dpi, options, dc->u.s_fixed.length);
4954           d_append_char (dpi, ' ');
4955         }
4956       if (dc->u.s_fixed.accum)
4957         d_append_string (dpi, "_Accum");
4958       else
4959         d_append_string (dpi, "_Fract");
4960       return;
4961
4962     case DEMANGLE_COMPONENT_ARGLIST:
4963     case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
4964       if (d_left (dc) != NULL)
4965         d_print_comp (dpi, options, d_left (dc));
4966       if (d_right (dc) != NULL)
4967         {
4968           size_t len;
4969           unsigned long int flush_count;
4970           /* Make sure ", " isn't flushed by d_append_string, otherwise
4971              dpi->len -= 2 wouldn't work.  */
4972           if (dpi->len >= sizeof (dpi->buf) - 2)
4973             d_print_flush (dpi);
4974           d_append_string (dpi, ", ");
4975           len = dpi->len;
4976           flush_count = dpi->flush_count;
4977           d_print_comp (dpi, options, d_right (dc));
4978           /* If that didn't print anything (which can happen with empty
4979              template argument packs), remove the comma and space.  */
4980           if (dpi->flush_count == flush_count && dpi->len == len)
4981             dpi->len -= 2;
4982         }
4983       return;
4984
4985     case DEMANGLE_COMPONENT_INITIALIZER_LIST:
4986       {
4987         struct demangle_component *type = d_left (dc);
4988         struct demangle_component *list = d_right (dc);
4989
4990         if (type)
4991           d_print_comp (dpi, options, type);
4992         d_append_char (dpi, '{');
4993         d_print_comp (dpi, options, list);
4994         d_append_char (dpi, '}');
4995       }
4996       return;
4997
4998     case DEMANGLE_COMPONENT_OPERATOR:
4999       {
5000         const struct demangle_operator_info *op = dc->u.s_operator.op;
5001         int len = op->len;
5002
5003         d_append_string (dpi, "operator");
5004         /* Add a space before new/delete.  */
5005         if (IS_LOWER (op->name[0]))
5006           d_append_char (dpi, ' ');
5007         /* Omit a trailing space.  */
5008         if (op->name[len-1] == ' ')
5009           --len;
5010         d_append_buffer (dpi, op->name, len);
5011         return;
5012       }
5013
5014     case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
5015       d_append_string (dpi, "operator ");
5016       d_print_comp (dpi, options, dc->u.s_extended_operator.name);
5017       return;
5018
5019     case DEMANGLE_COMPONENT_CAST:
5020       d_append_string (dpi, "operator ");
5021       d_print_cast (dpi, options, dc);
5022       return;
5023
5024     case DEMANGLE_COMPONENT_NULLARY:
5025       d_print_expr_op (dpi, options, d_left (dc));
5026       return;
5027
5028     case DEMANGLE_COMPONENT_UNARY:
5029       {
5030         struct demangle_component *op = d_left (dc);
5031         struct demangle_component *operand = d_right (dc);
5032         const char *code = NULL;
5033
5034         if (op->type == DEMANGLE_COMPONENT_OPERATOR)
5035           {
5036             code = op->u.s_operator.op->code;
5037             if (!strcmp (code, "ad"))
5038               {
5039                 /* Don't print the argument list for the address of a
5040                    function.  */
5041                 if (operand->type == DEMANGLE_COMPONENT_TYPED_NAME
5042                     && d_left (operand)->type == DEMANGLE_COMPONENT_QUAL_NAME
5043                     && d_right (operand)->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
5044                   operand = d_left (operand);
5045               }
5046             if (operand->type == DEMANGLE_COMPONENT_BINARY_ARGS)
5047               {
5048                 /* This indicates a suffix operator.  */
5049                 operand = d_left (operand);
5050                 d_print_subexpr (dpi, options, operand);
5051                 d_print_expr_op (dpi, options, op);
5052                 return;
5053               }
5054           }
5055
5056         if (op->type != DEMANGLE_COMPONENT_CAST)
5057           d_print_expr_op (dpi, options, op);
5058         else
5059           {
5060             d_append_char (dpi, '(');
5061             d_print_cast (dpi, options, op);
5062             d_append_char (dpi, ')');
5063           }
5064         if (code && !strcmp (code, "gs"))
5065           /* Avoid parens after '::'.  */
5066           d_print_comp (dpi, options, operand);
5067         else if (code && !strcmp (code, "st"))
5068           /* Always print parens for sizeof (type).  */
5069           {
5070             d_append_char (dpi, '(');
5071             d_print_comp (dpi, options, operand);
5072             d_append_char (dpi, ')');
5073           }
5074         else
5075           d_print_subexpr (dpi, options, operand);
5076       }
5077       return;
5078
5079     case DEMANGLE_COMPONENT_BINARY:
5080       if (d_right (dc)->type != DEMANGLE_COMPONENT_BINARY_ARGS)
5081         {
5082           d_print_error (dpi);
5083           return;
5084         }
5085
5086       if (op_is_new_cast (d_left (dc)))
5087         {
5088           d_print_expr_op (dpi, options, d_left (dc));
5089           d_append_char (dpi, '<');
5090           d_print_comp (dpi, options, d_left (d_right (dc)));
5091           d_append_string (dpi, ">(");
5092           d_print_comp (dpi, options, d_right (d_right (dc)));
5093           d_append_char (dpi, ')');
5094           return;
5095         }
5096
5097       /* We wrap an expression which uses the greater-than operator in
5098          an extra layer of parens so that it does not get confused
5099          with the '>' which ends the template parameters.  */
5100       if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
5101           && d_left (dc)->u.s_operator.op->len == 1
5102           && d_left (dc)->u.s_operator.op->name[0] == '>')
5103         d_append_char (dpi, '(');
5104
5105       if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") == 0
5106           && d_left (d_right (dc))->type == DEMANGLE_COMPONENT_TYPED_NAME)
5107         {
5108           /* Function call used in an expression should not have printed types
5109              of the function arguments.  Values of the function arguments still
5110              get printed below.  */
5111
5112           const struct demangle_component *func = d_left (d_right (dc));
5113
5114           if (d_right (func)->type != DEMANGLE_COMPONENT_FUNCTION_TYPE)
5115             d_print_error (dpi);
5116           d_print_subexpr (dpi, options, d_left (func));
5117         }
5118       else
5119         d_print_subexpr (dpi, options, d_left (d_right (dc)));
5120       if (strcmp (d_left (dc)->u.s_operator.op->code, "ix") == 0)
5121         {
5122           d_append_char (dpi, '[');
5123           d_print_comp (dpi, options, d_right (d_right (dc)));
5124           d_append_char (dpi, ']');
5125         }
5126       else
5127         {
5128           if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") != 0)
5129             d_print_expr_op (dpi, options, d_left (dc));
5130           d_print_subexpr (dpi, options, d_right (d_right (dc)));
5131         }
5132
5133       if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
5134           && d_left (dc)->u.s_operator.op->len == 1
5135           && d_left (dc)->u.s_operator.op->name[0] == '>')
5136         d_append_char (dpi, ')');
5137
5138       return;
5139
5140     case DEMANGLE_COMPONENT_BINARY_ARGS:
5141       /* We should only see this as part of DEMANGLE_COMPONENT_BINARY.  */
5142       d_print_error (dpi);
5143       return;
5144
5145     case DEMANGLE_COMPONENT_TRINARY:
5146       if (d_right (dc)->type != DEMANGLE_COMPONENT_TRINARY_ARG1
5147           || d_right (d_right (dc))->type != DEMANGLE_COMPONENT_TRINARY_ARG2)
5148         {
5149           d_print_error (dpi);
5150           return;
5151         }
5152       {
5153         struct demangle_component *op = d_left (dc);
5154         struct demangle_component *first = d_left (d_right (dc));
5155         struct demangle_component *second = d_left (d_right (d_right (dc)));
5156         struct demangle_component *third = d_right (d_right (d_right (dc)));
5157
5158         if (!strcmp (op->u.s_operator.op->code, "qu"))
5159           {
5160             d_print_subexpr (dpi, options, first);
5161             d_print_expr_op (dpi, options, op);
5162             d_print_subexpr (dpi, options, second);
5163             d_append_string (dpi, " : ");
5164             d_print_subexpr (dpi, options, third);
5165           }
5166         else
5167           {
5168             d_append_string (dpi, "new ");
5169             if (d_left (first) != NULL)
5170               {
5171                 d_print_subexpr (dpi, options, first);
5172                 d_append_char (dpi, ' ');
5173               }
5174             d_print_comp (dpi, options, second);
5175             if (third)
5176               d_print_subexpr (dpi, options, third);
5177           }
5178       }
5179       return;
5180
5181     case DEMANGLE_COMPONENT_TRINARY_ARG1:
5182     case DEMANGLE_COMPONENT_TRINARY_ARG2:
5183       /* We should only see these are part of DEMANGLE_COMPONENT_TRINARY.  */
5184       d_print_error (dpi);
5185       return;
5186
5187     case DEMANGLE_COMPONENT_LITERAL:
5188     case DEMANGLE_COMPONENT_LITERAL_NEG:
5189       {
5190         enum d_builtin_type_print tp;
5191
5192         /* For some builtin types, produce simpler output.  */
5193         tp = D_PRINT_DEFAULT;
5194         if (d_left (dc)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE)
5195           {
5196             tp = d_left (dc)->u.s_builtin.type->print;
5197             switch (tp)
5198               {
5199               case D_PRINT_INT:
5200               case D_PRINT_UNSIGNED:
5201               case D_PRINT_LONG:
5202               case D_PRINT_UNSIGNED_LONG:
5203               case D_PRINT_LONG_LONG:
5204               case D_PRINT_UNSIGNED_LONG_LONG:
5205                 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME)
5206                   {
5207                     if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
5208                       d_append_char (dpi, '-');
5209                     d_print_comp (dpi, options, d_right (dc));
5210                     switch (tp)
5211                       {
5212                       default:
5213                         break;
5214                       case D_PRINT_UNSIGNED:
5215                         d_append_char (dpi, 'u');
5216                         break;
5217                       case D_PRINT_LONG:
5218                         d_append_char (dpi, 'l');
5219                         break;
5220                       case D_PRINT_UNSIGNED_LONG:
5221                         d_append_string (dpi, "ul");
5222                         break;
5223                       case D_PRINT_LONG_LONG:
5224                         d_append_string (dpi, "ll");
5225                         break;
5226                       case D_PRINT_UNSIGNED_LONG_LONG:
5227                         d_append_string (dpi, "ull");
5228                         break;
5229                       }
5230                     return;
5231                   }
5232                 break;
5233
5234               case D_PRINT_BOOL:
5235                 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME
5236                     && d_right (dc)->u.s_name.len == 1
5237                     && dc->type == DEMANGLE_COMPONENT_LITERAL)
5238                   {
5239                     switch (d_right (dc)->u.s_name.s[0])
5240                       {
5241                       case '0':
5242                         d_append_string (dpi, "false");
5243                         return;
5244                       case '1':
5245                         d_append_string (dpi, "true");
5246                         return;
5247                       default:
5248                         break;
5249                       }
5250                   }
5251                 break;
5252
5253               default:
5254                 break;
5255               }
5256           }
5257
5258         d_append_char (dpi, '(');
5259         d_print_comp (dpi, options, d_left (dc));
5260         d_append_char (dpi, ')');
5261         if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
5262           d_append_char (dpi, '-');
5263         if (tp == D_PRINT_FLOAT)
5264           d_append_char (dpi, '[');
5265         d_print_comp (dpi, options, d_right (dc));
5266         if (tp == D_PRINT_FLOAT)
5267           d_append_char (dpi, ']');
5268       }
5269       return;
5270
5271     case DEMANGLE_COMPONENT_NUMBER:
5272       d_append_num (dpi, dc->u.s_number.number);
5273       return;
5274
5275     case DEMANGLE_COMPONENT_JAVA_RESOURCE:
5276       d_append_string (dpi, "java resource ");
5277       d_print_comp (dpi, options, d_left (dc));
5278       return;
5279
5280     case DEMANGLE_COMPONENT_COMPOUND_NAME:
5281       d_print_comp (dpi, options, d_left (dc));
5282       d_print_comp (dpi, options, d_right (dc));
5283       return;
5284
5285     case DEMANGLE_COMPONENT_CHARACTER:
5286       d_append_char (dpi, dc->u.s_character.character);
5287       return;
5288
5289     case DEMANGLE_COMPONENT_DECLTYPE:
5290       d_append_string (dpi, "decltype (");
5291       d_print_comp (dpi, options, d_left (dc));
5292       d_append_char (dpi, ')');
5293       return;
5294
5295     case DEMANGLE_COMPONENT_PACK_EXPANSION:
5296       {
5297         int len;
5298         int i;
5299         struct demangle_component *a = d_find_pack (dpi, d_left (dc));
5300         if (a == NULL)
5301           {
5302             /* d_find_pack won't find anything if the only packs involved
5303                in this expansion are function parameter packs; in that
5304                case, just print the pattern and "...".  */
5305             d_print_subexpr (dpi, options, d_left (dc));
5306             d_append_string (dpi, "...");
5307             return;
5308           }
5309
5310         len = d_pack_length (a);
5311         dc = d_left (dc);
5312         for (i = 0; i < len; ++i)
5313           {
5314             dpi->pack_index = i;
5315             d_print_comp (dpi, options, dc);
5316             if (i < len-1)
5317               d_append_string (dpi, ", ");
5318           }
5319       }
5320       return;
5321
5322     case DEMANGLE_COMPONENT_FUNCTION_PARAM:
5323       {
5324         long num = dc->u.s_number.number;
5325         if (num == 0)
5326           d_append_string (dpi, "this");
5327         else
5328           {
5329             d_append_string (dpi, "{parm#");
5330             d_append_num (dpi, num);
5331             d_append_char (dpi, '}');
5332           }
5333       }
5334       return;
5335
5336     case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
5337       d_append_string (dpi, "global constructors keyed to ");
5338       d_print_comp (dpi, options, dc->u.s_binary.left);
5339       return;
5340
5341     case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
5342       d_append_string (dpi, "global destructors keyed to ");
5343       d_print_comp (dpi, options, dc->u.s_binary.left);
5344       return;
5345
5346     case DEMANGLE_COMPONENT_LAMBDA:
5347       d_append_string (dpi, "{lambda(");
5348       d_print_comp (dpi, options, dc->u.s_unary_num.sub);
5349       d_append_string (dpi, ")#");
5350       d_append_num (dpi, dc->u.s_unary_num.num + 1);
5351       d_append_char (dpi, '}');
5352       return;
5353
5354     case DEMANGLE_COMPONENT_UNNAMED_TYPE:
5355       d_append_string (dpi, "{unnamed type#");
5356       d_append_num (dpi, dc->u.s_number.number + 1);
5357       d_append_char (dpi, '}');
5358       return;
5359
5360     case DEMANGLE_COMPONENT_CLONE:
5361       d_print_comp (dpi, options, d_left (dc));
5362       d_append_string (dpi, " [clone ");
5363       d_print_comp (dpi, options, d_right (dc));
5364       d_append_char (dpi, ']');
5365       return;
5366
5367     default:
5368       d_print_error (dpi);
5369       return;
5370     }
5371 }
5372
5373 static void
5374 d_print_comp (struct d_print_info *dpi, int options,
5375               const struct demangle_component *dc)
5376 {
5377   struct d_component_stack self;
5378
5379   self.dc = dc;
5380   self.parent = dpi->component_stack;
5381   dpi->component_stack = &self;
5382
5383   d_print_comp_inner (dpi, options, dc);
5384
5385   dpi->component_stack = self.parent;
5386 }
5387
5388 /* Print a Java dentifier.  For Java we try to handle encoded extended
5389    Unicode characters.  The C++ ABI doesn't mention Unicode encoding,
5390    so we don't it for C++.  Characters are encoded as
5391    __U<hex-char>+_.  */
5392
5393 static void
5394 d_print_java_identifier (struct d_print_info *dpi, const char *name, int len)
5395 {
5396   const char *p;
5397   const char *end;
5398
5399   end = name + len;
5400   for (p = name; p < end; ++p)
5401     {
5402       if (end - p > 3
5403           && p[0] == '_'
5404           && p[1] == '_'
5405           && p[2] == 'U')
5406         {
5407           unsigned long c;
5408           const char *q;
5409
5410           c = 0;
5411           for (q = p + 3; q < end; ++q)
5412             {
5413               int dig;
5414
5415               if (IS_DIGIT (*q))
5416                 dig = *q - '0';
5417               else if (*q >= 'A' && *q <= 'F')
5418                 dig = *q - 'A' + 10;
5419               else if (*q >= 'a' && *q <= 'f')
5420                 dig = *q - 'a' + 10;
5421               else
5422                 break;
5423
5424               c = c * 16 + dig;
5425             }
5426           /* If the Unicode character is larger than 256, we don't try
5427              to deal with it here.  FIXME.  */
5428           if (q < end && *q == '_' && c < 256)
5429             {
5430               d_append_char (dpi, c);
5431               p = q;
5432               continue;
5433             }
5434         }
5435
5436       d_append_char (dpi, *p);
5437     }
5438 }
5439
5440 /* Print a list of modifiers.  SUFFIX is 1 if we are printing
5441    qualifiers on this after printing a function.  */
5442
5443 static void
5444 d_print_mod_list (struct d_print_info *dpi, int options,
5445                   struct d_print_mod *mods, int suffix)
5446 {
5447   struct d_print_template *hold_dpt;
5448
5449   if (mods == NULL || d_print_saw_error (dpi))
5450     return;
5451
5452   if (mods->printed
5453       || (! suffix
5454           && (mods->mod->type == DEMANGLE_COMPONENT_RESTRICT_THIS
5455               || mods->mod->type == DEMANGLE_COMPONENT_VOLATILE_THIS
5456               || mods->mod->type == DEMANGLE_COMPONENT_CONST_THIS
5457               || mods->mod->type == DEMANGLE_COMPONENT_REFERENCE_THIS
5458               || (mods->mod->type
5459                   == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS))))
5460     {
5461       d_print_mod_list (dpi, options, mods->next, suffix);
5462       return;
5463     }
5464
5465   mods->printed = 1;
5466
5467   hold_dpt = dpi->templates;
5468   dpi->templates = mods->templates;
5469
5470   if (mods->mod->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
5471     {
5472       d_print_function_type (dpi, options, mods->mod, mods->next);
5473       dpi->templates = hold_dpt;
5474       return;
5475     }
5476   else if (mods->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
5477     {
5478       d_print_array_type (dpi, options, mods->mod, mods->next);
5479       dpi->templates = hold_dpt;
5480       return;
5481     }
5482   else if (mods->mod->type == DEMANGLE_COMPONENT_LOCAL_NAME)
5483     {
5484       struct d_print_mod *hold_modifiers;
5485       struct demangle_component *dc;
5486
5487       /* When this is on the modifier stack, we have pulled any
5488          qualifiers off the right argument already.  Otherwise, we
5489          print it as usual, but don't let the left argument see any
5490          modifiers.  */
5491
5492       hold_modifiers = dpi->modifiers;
5493       dpi->modifiers = NULL;
5494       d_print_comp (dpi, options, d_left (mods->mod));
5495       dpi->modifiers = hold_modifiers;
5496
5497       if ((options & DMGL_JAVA) == 0)
5498         d_append_string (dpi, "::");
5499       else
5500         d_append_char (dpi, '.');
5501
5502       dc = d_right (mods->mod);
5503
5504       if (dc->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
5505         {
5506           d_append_string (dpi, "{default arg#");
5507           d_append_num (dpi, dc->u.s_unary_num.num + 1);
5508           d_append_string (dpi, "}::");
5509           dc = dc->u.s_unary_num.sub;
5510         }
5511
5512       while (dc->type == DEMANGLE_COMPONENT_RESTRICT_THIS
5513              || dc->type == DEMANGLE_COMPONENT_VOLATILE_THIS
5514              || dc->type == DEMANGLE_COMPONENT_CONST_THIS
5515              || dc->type == DEMANGLE_COMPONENT_REFERENCE_THIS
5516              || dc->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS)
5517         dc = d_left (dc);
5518
5519       d_print_comp (dpi, options, dc);
5520
5521       dpi->templates = hold_dpt;
5522       return;
5523     }
5524
5525   d_print_mod (dpi, options, mods->mod);
5526
5527   dpi->templates = hold_dpt;
5528
5529   d_print_mod_list (dpi, options, mods->next, suffix);
5530 }
5531
5532 /* Print a modifier.  */
5533
5534 static void
5535 d_print_mod (struct d_print_info *dpi, int options,
5536              const struct demangle_component *mod)
5537 {
5538   switch (mod->type)
5539     {
5540     case DEMANGLE_COMPONENT_RESTRICT:
5541     case DEMANGLE_COMPONENT_RESTRICT_THIS:
5542       d_append_string (dpi, " restrict");
5543       return;
5544     case DEMANGLE_COMPONENT_VOLATILE:
5545     case DEMANGLE_COMPONENT_VOLATILE_THIS:
5546       d_append_string (dpi, " volatile");
5547       return;
5548     case DEMANGLE_COMPONENT_CONST:
5549     case DEMANGLE_COMPONENT_CONST_THIS:
5550       d_append_string (dpi, " const");
5551       return;
5552     case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
5553       d_append_char (dpi, ' ');
5554       d_print_comp (dpi, options, d_right (mod));
5555       return;
5556     case DEMANGLE_COMPONENT_POINTER:
5557       /* There is no pointer symbol in Java.  */
5558       if ((options & DMGL_JAVA) == 0)
5559         d_append_char (dpi, '*');
5560       return;
5561     case DEMANGLE_COMPONENT_REFERENCE_THIS:
5562       /* For the ref-qualifier, put a space before the &.  */
5563       d_append_char (dpi, ' ');
5564     case DEMANGLE_COMPONENT_REFERENCE:
5565       d_append_char (dpi, '&');
5566       return;
5567     case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
5568       d_append_char (dpi, ' ');
5569     case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
5570       d_append_string (dpi, "&&");
5571       return;
5572     case DEMANGLE_COMPONENT_COMPLEX:
5573       d_append_string (dpi, "complex ");
5574       return;
5575     case DEMANGLE_COMPONENT_IMAGINARY:
5576       d_append_string (dpi, "imaginary ");
5577       return;
5578     case DEMANGLE_COMPONENT_PTRMEM_TYPE:
5579       if (d_last_char (dpi) != '(')
5580         d_append_char (dpi, ' ');
5581       d_print_comp (dpi, options, d_left (mod));
5582       d_append_string (dpi, "::*");
5583       return;
5584     case DEMANGLE_COMPONENT_TYPED_NAME:
5585       d_print_comp (dpi, options, d_left (mod));
5586       return;
5587     case DEMANGLE_COMPONENT_VECTOR_TYPE:
5588       d_append_string (dpi, " __vector(");
5589       d_print_comp (dpi, options, d_left (mod));
5590       d_append_char (dpi, ')');
5591       return;
5592
5593     default:
5594       /* Otherwise, we have something that won't go back on the
5595          modifier stack, so we can just print it.  */
5596       d_print_comp (dpi, options, mod);
5597       return;
5598     }
5599 }
5600
5601 /* Print a function type, except for the return type.  */
5602
5603 static void
5604 d_print_function_type (struct d_print_info *dpi, int options,
5605                        const struct demangle_component *dc,
5606                        struct d_print_mod *mods)
5607 {
5608   int need_paren;
5609   int need_space;
5610   struct d_print_mod *p;
5611   struct d_print_mod *hold_modifiers;
5612
5613   need_paren = 0;
5614   need_space = 0;
5615   for (p = mods; p != NULL; p = p->next)
5616     {
5617       if (p->printed)
5618         break;
5619
5620       switch (p->mod->type)
5621         {
5622         case DEMANGLE_COMPONENT_POINTER:
5623         case DEMANGLE_COMPONENT_REFERENCE:
5624         case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
5625           need_paren = 1;
5626           break;
5627         case DEMANGLE_COMPONENT_RESTRICT:
5628         case DEMANGLE_COMPONENT_VOLATILE:
5629         case DEMANGLE_COMPONENT_CONST:
5630         case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
5631         case DEMANGLE_COMPONENT_COMPLEX:
5632         case DEMANGLE_COMPONENT_IMAGINARY:
5633         case DEMANGLE_COMPONENT_PTRMEM_TYPE:
5634           need_space = 1;
5635           need_paren = 1;
5636           break;
5637         case DEMANGLE_COMPONENT_RESTRICT_THIS:
5638         case DEMANGLE_COMPONENT_VOLATILE_THIS:
5639         case DEMANGLE_COMPONENT_CONST_THIS:
5640         case DEMANGLE_COMPONENT_REFERENCE_THIS:
5641         case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
5642           break;
5643         default:
5644           break;
5645         }
5646       if (need_paren)
5647         break;
5648     }
5649
5650   if (need_paren)
5651     {
5652       if (! need_space)
5653         {
5654           if (d_last_char (dpi) != '('
5655               && d_last_char (dpi) != '*')
5656             need_space = 1;
5657         }
5658       if (need_space && d_last_char (dpi) != ' ')
5659         d_append_char (dpi, ' ');
5660       d_append_char (dpi, '(');
5661     }
5662
5663   hold_modifiers = dpi->modifiers;
5664   dpi->modifiers = NULL;
5665
5666   d_print_mod_list (dpi, options, mods, 0);
5667
5668   if (need_paren)
5669     d_append_char (dpi, ')');
5670
5671   d_append_char (dpi, '(');
5672
5673   if (d_right (dc) != NULL)
5674     d_print_comp (dpi, options, d_right (dc));
5675
5676   d_append_char (dpi, ')');
5677
5678   d_print_mod_list (dpi, options, mods, 1);
5679
5680   dpi->modifiers = hold_modifiers;
5681 }
5682
5683 /* Print an array type, except for the element type.  */
5684
5685 static void
5686 d_print_array_type (struct d_print_info *dpi, int options,
5687                     const struct demangle_component *dc,
5688                     struct d_print_mod *mods)
5689 {
5690   int need_space;
5691
5692   need_space = 1;
5693   if (mods != NULL)
5694     {
5695       int need_paren;
5696       struct d_print_mod *p;
5697
5698       need_paren = 0;
5699       for (p = mods; p != NULL; p = p->next)
5700         {
5701           if (! p->printed)
5702             {
5703               if (p->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
5704                 {
5705                   need_space = 0;
5706                   break;
5707                 }
5708               else
5709                 {
5710                   need_paren = 1;
5711                   need_space = 1;
5712                   break;
5713                 }
5714             }
5715         }
5716
5717       if (need_paren)
5718         d_append_string (dpi, " (");
5719
5720       d_print_mod_list (dpi, options, mods, 0);
5721
5722       if (need_paren)
5723         d_append_char (dpi, ')');
5724     }
5725
5726   if (need_space)
5727     d_append_char (dpi, ' ');
5728
5729   d_append_char (dpi, '[');
5730
5731   if (d_left (dc) != NULL)
5732     d_print_comp (dpi, options, d_left (dc));
5733
5734   d_append_char (dpi, ']');
5735 }
5736
5737 /* Print an operator in an expression.  */
5738
5739 static void
5740 d_print_expr_op (struct d_print_info *dpi, int options,
5741                  const struct demangle_component *dc)
5742 {
5743   if (dc->type == DEMANGLE_COMPONENT_OPERATOR)
5744     d_append_buffer (dpi, dc->u.s_operator.op->name,
5745                      dc->u.s_operator.op->len);
5746   else
5747     d_print_comp (dpi, options, dc);
5748 }
5749
5750 /* Print a cast.  */
5751
5752 static void
5753 d_print_cast (struct d_print_info *dpi, int options,
5754               const struct demangle_component *dc)
5755 {
5756   struct d_print_template dpt;
5757
5758   /* For a cast operator, we need the template parameters from
5759      the enclosing template in scope for processing the type.  */
5760   if (dpi->current_template != NULL)
5761     {
5762       dpt.next = dpi->templates;
5763       dpi->templates = &dpt;
5764       dpt.template_decl = dpi->current_template;
5765     }
5766
5767   if (d_left (dc)->type != DEMANGLE_COMPONENT_TEMPLATE)
5768     {
5769       d_print_comp (dpi, options, d_left (dc));
5770       if (dpi->current_template != NULL)
5771         dpi->templates = dpt.next;
5772     }
5773   else
5774     {
5775       d_print_comp (dpi, options, d_left (d_left (dc)));
5776
5777       /* For a templated cast operator, we need to remove the template
5778          parameters from scope after printing the operator name,
5779          so we need to handle the template printing here.  */
5780       if (dpi->current_template != NULL)
5781         dpi->templates = dpt.next;
5782
5783       if (d_last_char (dpi) == '<')
5784         d_append_char (dpi, ' ');
5785       d_append_char (dpi, '<');
5786       d_print_comp (dpi, options, d_right (d_left (dc)));
5787       /* Avoid generating two consecutive '>' characters, to avoid
5788          the C++ syntactic ambiguity.  */
5789       if (d_last_char (dpi) == '>')
5790         d_append_char (dpi, ' ');
5791       d_append_char (dpi, '>');
5792     }
5793 }
5794
5795 /* Initialize the information structure we use to pass around
5796    information.  */
5797
5798 CP_STATIC_IF_GLIBCPP_V3
5799 void
5800 cplus_demangle_init_info (const char *mangled, int options, size_t len,
5801                           struct d_info *di)
5802 {
5803   di->s = mangled;
5804   di->send = mangled + len;
5805   di->options = options;
5806
5807   di->n = mangled;
5808
5809   /* We can not need more components than twice the number of chars in
5810      the mangled string.  Most components correspond directly to
5811      chars, but the ARGLIST types are exceptions.  */
5812   di->num_comps = 2 * len;
5813   di->next_comp = 0;
5814
5815   /* Similarly, we can not need more substitutions than there are
5816      chars in the mangled string.  */
5817   di->num_subs = len;
5818   di->next_sub = 0;
5819   di->did_subs = 0;
5820
5821   di->last_name = NULL;
5822
5823   di->expansion = 0;
5824   di->is_expression = 0;
5825   di->is_conversion = 0;
5826 }
5827
5828 /* Internal implementation for the demangler.  If MANGLED is a g++ v3 ABI
5829    mangled name, return strings in repeated callback giving the demangled
5830    name.  OPTIONS is the usual libiberty demangler options.  On success,
5831    this returns 1.  On failure, returns 0.  */
5832
5833 static int
5834 d_demangle_callback (const char *mangled, int options,
5835                      demangle_callbackref callback, void *opaque)
5836 {
5837   enum
5838     {
5839       DCT_TYPE,
5840       DCT_MANGLED,
5841       DCT_GLOBAL_CTORS,
5842       DCT_GLOBAL_DTORS
5843     }
5844   type;
5845   struct d_info di;
5846   struct demangle_component *dc;
5847   int status;
5848
5849   if (mangled[0] == '_' && mangled[1] == 'Z')
5850     type = DCT_MANGLED;
5851   else if (strncmp (mangled, "_GLOBAL_", 8) == 0
5852            && (mangled[8] == '.' || mangled[8] == '_' || mangled[8] == '$')
5853            && (mangled[9] == 'D' || mangled[9] == 'I')
5854            && mangled[10] == '_')
5855     type = mangled[9] == 'I' ? DCT_GLOBAL_CTORS : DCT_GLOBAL_DTORS;
5856   else
5857     {
5858       if ((options & DMGL_TYPES) == 0)
5859         return 0;
5860       type = DCT_TYPE;
5861     }
5862
5863   cplus_demangle_init_info (mangled, options, strlen (mangled), &di);
5864
5865   {
5866 #ifdef CP_DYNAMIC_ARRAYS
5867     __extension__ struct demangle_component comps[di.num_comps];
5868     __extension__ struct demangle_component *subs[di.num_subs];
5869
5870     di.comps = comps;
5871     di.subs = subs;
5872 #else
5873     di.comps = alloca (di.num_comps * sizeof (*di.comps));
5874     di.subs = alloca (di.num_subs * sizeof (*di.subs));
5875 #endif
5876
5877     switch (type)
5878       {
5879       case DCT_TYPE:
5880         dc = cplus_demangle_type (&di);
5881         break;
5882       case DCT_MANGLED:
5883         dc = cplus_demangle_mangled_name (&di, 1);
5884         break;
5885       case DCT_GLOBAL_CTORS:
5886       case DCT_GLOBAL_DTORS:
5887         d_advance (&di, 11);
5888         dc = d_make_comp (&di,
5889                           (type == DCT_GLOBAL_CTORS
5890                            ? DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
5891                            : DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS),
5892                           d_make_demangle_mangled_name (&di, d_str (&di)),
5893                           NULL);
5894         d_advance (&di, strlen (d_str (&di)));
5895         break;
5896       default:
5897         abort (); /* We have listed all the cases.  */
5898       }
5899
5900     /* If DMGL_PARAMS is set, then if we didn't consume the entire
5901        mangled string, then we didn't successfully demangle it.  If
5902        DMGL_PARAMS is not set, we didn't look at the trailing
5903        parameters.  */
5904     if (((options & DMGL_PARAMS) != 0) && d_peek_char (&di) != '\0')
5905       dc = NULL;
5906
5907 #ifdef CP_DEMANGLE_DEBUG
5908     d_dump (dc, 0);
5909 #endif
5910
5911     status = (dc != NULL)
5912              ? cplus_demangle_print_callback (options, dc, callback, opaque)
5913              : 0;
5914   }
5915
5916   return status;
5917 }
5918
5919 /* Entry point for the demangler.  If MANGLED is a g++ v3 ABI mangled
5920    name, return a buffer allocated with malloc holding the demangled
5921    name.  OPTIONS is the usual libiberty demangler options.  On
5922    success, this sets *PALC to the allocated size of the returned
5923    buffer.  On failure, this sets *PALC to 0 for a bad name, or 1 for
5924    a memory allocation failure, and returns NULL.  */
5925
5926 static char *
5927 d_demangle (const char *mangled, int options, size_t *palc)
5928 {
5929   struct d_growable_string dgs;
5930   int status;
5931
5932   d_growable_string_init (&dgs, 0);
5933
5934   status = d_demangle_callback (mangled, options,
5935                                 d_growable_string_callback_adapter, &dgs);
5936   if (status == 0)
5937     {
5938       free (dgs.buf);
5939       *palc = 0;
5940       return NULL;
5941     }
5942
5943   *palc = dgs.allocation_failure ? 1 : dgs.alc;
5944   return dgs.buf;
5945 }
5946
5947 #if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3)
5948
5949 extern char *__cxa_demangle (const char *, char *, size_t *, int *);
5950
5951 /* ia64 ABI-mandated entry point in the C++ runtime library for
5952    performing demangling.  MANGLED_NAME is a NUL-terminated character
5953    string containing the name to be demangled.
5954
5955    OUTPUT_BUFFER is a region of memory, allocated with malloc, of
5956    *LENGTH bytes, into which the demangled name is stored.  If
5957    OUTPUT_BUFFER is not long enough, it is expanded using realloc.
5958    OUTPUT_BUFFER may instead be NULL; in that case, the demangled name
5959    is placed in a region of memory allocated with malloc.
5960
5961    If LENGTH is non-NULL, the length of the buffer containing the
5962    demangled name, is placed in *LENGTH.
5963
5964    The return value is a pointer to the start of the NUL-terminated
5965    demangled name, or NULL if the demangling fails.  The caller is
5966    responsible for deallocating this memory using free.
5967
5968    *STATUS is set to one of the following values:
5969       0: The demangling operation succeeded.
5970      -1: A memory allocation failure occurred.
5971      -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
5972      -3: One of the arguments is invalid.
5973
5974    The demangling is performed using the C++ ABI mangling rules, with
5975    GNU extensions.  */
5976
5977 char *
5978 __cxa_demangle (const char *mangled_name, char *output_buffer,
5979                 size_t *length, int *status)
5980 {
5981   char *demangled;
5982   size_t alc;
5983
5984   if (mangled_name == NULL)
5985     {
5986       if (status != NULL)
5987         *status = -3;
5988       return NULL;
5989     }
5990
5991   if (output_buffer != NULL && length == NULL)
5992     {
5993       if (status != NULL)
5994         *status = -3;
5995       return NULL;
5996     }
5997
5998   demangled = d_demangle (mangled_name, DMGL_PARAMS | DMGL_TYPES, &alc);
5999
6000   if (demangled == NULL)
6001     {
6002       if (status != NULL)
6003         {
6004           if (alc == 1)
6005             *status = -1;
6006           else
6007             *status = -2;
6008         }
6009       return NULL;
6010     }
6011
6012   if (output_buffer == NULL)
6013     {
6014       if (length != NULL)
6015         *length = alc;
6016     }
6017   else
6018     {
6019       if (strlen (demangled) < *length)
6020         {
6021           strcpy (output_buffer, demangled);
6022           free (demangled);
6023           demangled = output_buffer;
6024         }
6025       else
6026         {
6027           free (output_buffer);
6028           *length = alc;
6029         }
6030     }
6031
6032   if (status != NULL)
6033     *status = 0;
6034
6035   return demangled;
6036 }
6037
6038 extern int __gcclibcxx_demangle_callback (const char *,
6039                                           void (*)
6040                                             (const char *, size_t, void *),
6041                                           void *);
6042
6043 /* Alternative, allocationless entry point in the C++ runtime library
6044    for performing demangling.  MANGLED_NAME is a NUL-terminated character
6045    string containing the name to be demangled.
6046
6047    CALLBACK is a callback function, called with demangled string
6048    segments as demangling progresses; it is called at least once,
6049    but may be called more than once.  OPAQUE is a generalized pointer
6050    used as a callback argument.
6051
6052    The return code is one of the following values, equivalent to
6053    the STATUS values of __cxa_demangle() (excluding -1, since this
6054    function performs no memory allocations):
6055       0: The demangling operation succeeded.
6056      -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
6057      -3: One of the arguments is invalid.
6058
6059    The demangling is performed using the C++ ABI mangling rules, with
6060    GNU extensions.  */
6061
6062 int
6063 __gcclibcxx_demangle_callback (const char *mangled_name,
6064                                void (*callback) (const char *, size_t, void *),
6065                                void *opaque)
6066 {
6067   int status;
6068
6069   if (mangled_name == NULL || callback == NULL)
6070     return -3;
6071
6072   status = d_demangle_callback (mangled_name, DMGL_PARAMS | DMGL_TYPES,
6073                                 callback, opaque);
6074   if (status == 0)
6075     return -2;
6076
6077   return 0;
6078 }
6079
6080 #else /* ! (IN_LIBGCC2 || IN_GLIBCPP_V3) */
6081
6082 /* Entry point for libiberty demangler.  If MANGLED is a g++ v3 ABI
6083    mangled name, return a buffer allocated with malloc holding the
6084    demangled name.  Otherwise, return NULL.  */
6085
6086 char *
6087 cplus_demangle_v3 (const char *mangled, int options)
6088 {
6089   size_t alc;
6090
6091   return d_demangle (mangled, options, &alc);
6092 }
6093
6094 int
6095 cplus_demangle_v3_callback (const char *mangled, int options,
6096                             demangle_callbackref callback, void *opaque)
6097 {
6098   return d_demangle_callback (mangled, options, callback, opaque);
6099 }
6100
6101 /* Demangle a Java symbol.  Java uses a subset of the V3 ABI C++ mangling 
6102    conventions, but the output formatting is a little different.
6103    This instructs the C++ demangler not to emit pointer characters ("*"), to
6104    use Java's namespace separator symbol ("." instead of "::"), and to output
6105    JArray<TYPE> as TYPE[].  */
6106
6107 char *
6108 java_demangle_v3 (const char *mangled)
6109 {
6110   size_t alc;
6111
6112   return d_demangle (mangled, DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX, &alc);
6113 }
6114
6115 int
6116 java_demangle_v3_callback (const char *mangled,
6117                            demangle_callbackref callback, void *opaque)
6118 {
6119   return d_demangle_callback (mangled,
6120                               DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX,
6121                               callback, opaque);
6122 }
6123
6124 #endif /* IN_LIBGCC2 || IN_GLIBCPP_V3 */
6125
6126 #ifndef IN_GLIBCPP_V3
6127
6128 /* Demangle a string in order to find out whether it is a constructor
6129    or destructor.  Return non-zero on success.  Set *CTOR_KIND and
6130    *DTOR_KIND appropriately.  */
6131
6132 static int
6133 is_ctor_or_dtor (const char *mangled,
6134                  enum gnu_v3_ctor_kinds *ctor_kind,
6135                  enum gnu_v3_dtor_kinds *dtor_kind)
6136 {
6137   struct d_info di;
6138   struct demangle_component *dc;
6139   int ret;
6140
6141   *ctor_kind = (enum gnu_v3_ctor_kinds) 0;
6142   *dtor_kind = (enum gnu_v3_dtor_kinds) 0;
6143
6144   cplus_demangle_init_info (mangled, DMGL_GNU_V3, strlen (mangled), &di);
6145
6146   {
6147 #ifdef CP_DYNAMIC_ARRAYS
6148     __extension__ struct demangle_component comps[di.num_comps];
6149     __extension__ struct demangle_component *subs[di.num_subs];
6150
6151     di.comps = comps;
6152     di.subs = subs;
6153 #else
6154     di.comps = alloca (di.num_comps * sizeof (*di.comps));
6155     di.subs = alloca (di.num_subs * sizeof (*di.subs));
6156 #endif
6157
6158     dc = cplus_demangle_mangled_name (&di, 1);
6159
6160     /* Note that because we did not pass DMGL_PARAMS, we don't expect
6161        to demangle the entire string.  */
6162
6163     ret = 0;
6164     while (dc != NULL)
6165       {
6166         switch (dc->type)
6167           {
6168             /* These cannot appear on a constructor or destructor.  */
6169           case DEMANGLE_COMPONENT_RESTRICT_THIS:
6170           case DEMANGLE_COMPONENT_VOLATILE_THIS:
6171           case DEMANGLE_COMPONENT_CONST_THIS:
6172           case DEMANGLE_COMPONENT_REFERENCE_THIS:
6173           case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
6174           default:
6175             dc = NULL;
6176             break;
6177           case DEMANGLE_COMPONENT_TYPED_NAME:
6178           case DEMANGLE_COMPONENT_TEMPLATE:
6179             dc = d_left (dc);
6180             break;
6181           case DEMANGLE_COMPONENT_QUAL_NAME:
6182           case DEMANGLE_COMPONENT_LOCAL_NAME:
6183             dc = d_right (dc);
6184             break;
6185           case DEMANGLE_COMPONENT_CTOR:
6186             *ctor_kind = dc->u.s_ctor.kind;
6187             ret = 1;
6188             dc = NULL;
6189             break;
6190           case DEMANGLE_COMPONENT_DTOR:
6191             *dtor_kind = dc->u.s_dtor.kind;
6192             ret = 1;
6193             dc = NULL;
6194             break;
6195           }
6196       }
6197   }
6198
6199   return ret;
6200 }
6201
6202 /* Return whether NAME is the mangled form of a g++ V3 ABI constructor
6203    name.  A non-zero return indicates the type of constructor.  */
6204
6205 enum gnu_v3_ctor_kinds
6206 is_gnu_v3_mangled_ctor (const char *name)
6207 {
6208   enum gnu_v3_ctor_kinds ctor_kind;
6209   enum gnu_v3_dtor_kinds dtor_kind;
6210
6211   if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
6212     return (enum gnu_v3_ctor_kinds) 0;
6213   return ctor_kind;
6214 }
6215
6216
6217 /* Return whether NAME is the mangled form of a g++ V3 ABI destructor
6218    name.  A non-zero return indicates the type of destructor.  */
6219
6220 enum gnu_v3_dtor_kinds
6221 is_gnu_v3_mangled_dtor (const char *name)
6222 {
6223   enum gnu_v3_ctor_kinds ctor_kind;
6224   enum gnu_v3_dtor_kinds dtor_kind;
6225
6226   if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
6227     return (enum gnu_v3_dtor_kinds) 0;
6228   return dtor_kind;
6229 }
6230
6231 #endif /* IN_GLIBCPP_V3 */
6232
6233 #ifdef STANDALONE_DEMANGLER
6234
6235 #include "getopt.h"
6236 #include "dyn-string.h"
6237
6238 static void print_usage (FILE* fp, int exit_value);
6239
6240 #define IS_ALPHA(CHAR)                                                  \
6241   (((CHAR) >= 'a' && (CHAR) <= 'z')                                     \
6242    || ((CHAR) >= 'A' && (CHAR) <= 'Z'))
6243
6244 /* Non-zero if CHAR is a character than can occur in a mangled name.  */
6245 #define is_mangled_char(CHAR)                                           \
6246   (IS_ALPHA (CHAR) || IS_DIGIT (CHAR)                                   \
6247    || (CHAR) == '_' || (CHAR) == '.' || (CHAR) == '$')
6248
6249 /* The name of this program, as invoked.  */
6250 const char* program_name;
6251
6252 /* Prints usage summary to FP and then exits with EXIT_VALUE.  */
6253
6254 static void
6255 print_usage (FILE* fp, int exit_value)
6256 {
6257   fprintf (fp, "Usage: %s [options] [names ...]\n", program_name);
6258   fprintf (fp, "Options:\n");
6259   fprintf (fp, "  -h,--help       Display this message.\n");
6260   fprintf (fp, "  -p,--no-params  Don't display function parameters\n");
6261   fprintf (fp, "  -v,--verbose    Produce verbose demanglings.\n");
6262   fprintf (fp, "If names are provided, they are demangled.  Otherwise filters standard input.\n");
6263
6264   exit (exit_value);
6265 }
6266
6267 /* Option specification for getopt_long.  */
6268 static const struct option long_options[] = 
6269 {
6270   { "help",      no_argument, NULL, 'h' },
6271   { "no-params", no_argument, NULL, 'p' },
6272   { "verbose",   no_argument, NULL, 'v' },
6273   { NULL,        no_argument, NULL, 0   },
6274 };
6275
6276 /* Main entry for a demangling filter executable.  It will demangle
6277    its command line arguments, if any.  If none are provided, it will
6278    filter stdin to stdout, replacing any recognized mangled C++ names
6279    with their demangled equivalents.  */
6280
6281 int
6282 main (int argc, char *argv[])
6283 {
6284   int i;
6285   int opt_char;
6286   int options = DMGL_PARAMS | DMGL_ANSI | DMGL_TYPES;
6287
6288   /* Use the program name of this program, as invoked.  */
6289   program_name = argv[0];
6290
6291   /* Parse options.  */
6292   do 
6293     {
6294       opt_char = getopt_long (argc, argv, "hpv", long_options, NULL);
6295       switch (opt_char)
6296         {
6297         case '?':  /* Unrecognized option.  */
6298           print_usage (stderr, 1);
6299           break;
6300
6301         case 'h':
6302           print_usage (stdout, 0);
6303           break;
6304
6305         case 'p':
6306           options &= ~ DMGL_PARAMS;
6307           break;
6308
6309         case 'v':
6310           options |= DMGL_VERBOSE;
6311           break;
6312         }
6313     }
6314   while (opt_char != -1);
6315
6316   if (optind == argc) 
6317     /* No command line arguments were provided.  Filter stdin.  */
6318     {
6319       dyn_string_t mangled = dyn_string_new (3);
6320       char *s;
6321
6322       /* Read all of input.  */
6323       while (!feof (stdin))
6324         {
6325           char c;
6326
6327           /* Pile characters into mangled until we hit one that can't
6328              occur in a mangled name.  */
6329           c = getchar ();
6330           while (!feof (stdin) && is_mangled_char (c))
6331             {
6332               dyn_string_append_char (mangled, c);
6333               if (feof (stdin))
6334                 break;
6335               c = getchar ();
6336             }
6337
6338           if (dyn_string_length (mangled) > 0)
6339             {
6340 #ifdef IN_GLIBCPP_V3
6341               s = __cxa_demangle (dyn_string_buf (mangled), NULL, NULL, NULL);
6342 #else
6343               s = cplus_demangle_v3 (dyn_string_buf (mangled), options);
6344 #endif
6345
6346               if (s != NULL)
6347                 {
6348                   fputs (s, stdout);
6349                   free (s);
6350                 }
6351               else
6352                 {
6353                   /* It might not have been a mangled name.  Print the
6354                      original text.  */
6355                   fputs (dyn_string_buf (mangled), stdout);
6356                 }
6357
6358               dyn_string_clear (mangled);
6359             }
6360
6361           /* If we haven't hit EOF yet, we've read one character that
6362              can't occur in a mangled name, so print it out.  */
6363           if (!feof (stdin))
6364             putchar (c);
6365         }
6366
6367       dyn_string_delete (mangled);
6368     }
6369   else
6370     /* Demangle command line arguments.  */
6371     {
6372       /* Loop over command line arguments.  */
6373       for (i = optind; i < argc; ++i)
6374         {
6375           char *s;
6376 #ifdef IN_GLIBCPP_V3
6377           int status;
6378 #endif
6379
6380           /* Attempt to demangle.  */
6381 #ifdef IN_GLIBCPP_V3
6382           s = __cxa_demangle (argv[i], NULL, NULL, &status);
6383 #else
6384           s = cplus_demangle_v3 (argv[i], options);
6385 #endif
6386
6387           /* If it worked, print the demangled name.  */
6388           if (s != NULL)
6389             {
6390               printf ("%s\n", s);
6391               free (s);
6392             }
6393           else
6394             {
6395 #ifdef IN_GLIBCPP_V3
6396               fprintf (stderr, "Failed: %s (status %d)\n", argv[i], status);
6397 #else
6398               fprintf (stderr, "Failed: %s\n", argv[i]);
6399 #endif
6400             }
6401         }
6402     }
6403
6404   return 0;
6405 }
6406
6407 #endif /* STANDALONE_DEMANGLER */