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