OSDN Git Service

Fix for PR c++/13447:
[pf3gnuchains/gcc-fork.git] / libiberty / cp-demangle.c
1 /* Demangler for g++ V3 ABI.
2    Copyright (C) 2003 Free Software Foundation, Inc.
3    Written by Ian Lance Taylor <ian@wasabisystems.com>.
4
5    This file is part of the libiberty library, which is part of GCC.
6
7    This file is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11
12    In addition to the permissions in the GNU General Public License, the
13    Free Software Foundation gives you unlimited permission to link the
14    compiled version of this file into combinations with other programs,
15    and to distribute those combinations without any restriction coming
16    from the use of this file.  (The General Public License restrictions
17    do apply in other respects; for example, they cover modification of
18    the file, and distribution when not linked into a combined
19    executable.)
20
21    This program is distributed in the hope that it will be useful,
22    but WITHOUT ANY WARRANTY; without even the implied warranty of
23    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24    GNU General Public License for more details.
25
26    You should have received a copy of the GNU General Public License
27    along with this program; if not, write to the Free Software
28    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 
29 */
30
31 /* This code implements a demangler for the g++ V3 ABI.  The ABI is
32    described on this web page:
33        http://www.codesourcery.com/cxx-abi/abi.html#mangling
34
35    This code was written while looking at the demangler written by
36    Alex Samuel <samuel@codesourcery.com>.
37
38    This code first pulls the mangled name apart into a list of
39    components, and then walks the list generating the demangled
40    name.
41
42    This file will normally define the following functions, q.v.:
43       char *cplus_demangle_v3(const char *mangled, int options)
44       char *java_demangle_v3(const char *mangled)
45       enum gnu_v3_ctor_kinds is_gnu_v3_mangled_ctor (const char *name)
46       enum gnu_v3_dtor_kinds is_gnu_v3_mangled_dtor (const char *name)
47
48    Preprocessor macros you can define while compiling this file:
49
50    IN_LIBGCC2
51       If defined, this file defines the following function, q.v.:
52          char *__cxa_demangle (const char *mangled, char *buf, size_t *len,
53                                int *status)
54       instead of cplus_demangle_v3() and java_demangle_v3().
55
56    IN_GLIBCPP_V3
57       If defined, this file defines only __cxa_demangle().
58
59    STANDALONE_DEMANGLER
60       If defined, this file defines a main() function which demangles
61       any arguments, or, if none, demangles stdin.
62
63    CP_DEMANGLE_DEBUG
64       If defined, turns on debugging mode, which prints information on
65       stdout about the mangled string.  This is not generally useful.
66 */
67
68 #ifdef HAVE_CONFIG_H
69 #include "config.h"
70 #endif
71
72 #include <stdio.h>
73
74 #ifdef HAVE_STDLIB_H
75 #include <stdlib.h>
76 #endif
77 #ifdef HAVE_STRING_H
78 #include <string.h>
79 #endif
80
81 #include "ansidecl.h"
82 #include "libiberty.h"
83 #include "demangle.h"
84
85 /* We avoid pulling in the ctype tables, to prevent pulling in
86    additional unresolved symbols when this code is used in a library.
87    FIXME: Is this really a valid reason?  This comes from the original
88    V3 demangler code.
89
90    As of this writing this file has the following undefined references
91    when compiled with -DIN_GLIBCPP_V3: malloc, realloc, free, memcpy,
92    strcpy, strcat, strlen.  */
93
94 #define IS_DIGIT(c) ((c) >= '0' && (c) <= '9')
95 #define IS_UPPER(c) ((c) >= 'A' && (c) <= 'Z')
96 #define IS_LOWER(c) ((c) >= 'a' && (c) <= 'z')
97
98 /* The prefix prepended by GCC to an identifier represnting the
99    anonymous namespace.  */
100 #define ANONYMOUS_NAMESPACE_PREFIX "_GLOBAL_"
101 #define ANONYMOUS_NAMESPACE_PREFIX_LEN \
102   (sizeof (ANONYMOUS_NAMESPACE_PREFIX) - 1)
103
104 /* Information we keep for operators.  */
105
106 struct d_operator_info
107 {
108   /* Mangled name.  */
109   const char *code;
110   /* Real name.  */
111   const char *name;
112   /* Number of arguments.  */
113   int args;
114 };
115
116 /* How to print the value of a builtin type.  */
117
118 enum d_builtin_type_print
119 {
120   /* Print as (type)val.  */
121   D_PRINT_DEFAULT,
122   /* Print as integer.  */
123   D_PRINT_INT,
124   /* Print as long, with trailing `l'.  */
125   D_PRINT_LONG,
126   /* Print as bool.  */
127   D_PRINT_BOOL,
128   /* Print in usual way, but here to detect void.  */
129   D_PRINT_VOID
130 };
131
132 /* Information we keep for a builtin type.  */
133
134 struct d_builtin_type_info
135 {
136   /* Type name.  */
137   const char *name;
138   /* Type name when using Java.  */
139   const char *java_name;
140   /* How to print a value of this type.  */
141   enum d_builtin_type_print print;
142 };
143
144 /* Information we keep for the standard substitutions.  */
145
146 struct d_standard_sub_info
147 {
148   /* The code for this substitution.  */
149   char code;
150   /* The simple string it expands to.  */
151   const char *simple_expansion;
152   /* The results of a full, verbose, expansion.  This is used when
153      qualifying a constructor/destructor, or when in verbose mode.  */
154   const char *full_expansion;
155   /* What to set the last_name field of d_info to; NULL if we should
156      not set it.  This is only relevant when qualifying a
157      constructor/destructor.  */
158   const char *set_last_name;
159 };
160
161 /* Component types found in mangled names.  */
162
163 enum d_comp_type
164 {
165   /* A name.  */
166   D_COMP_NAME,
167   /* A qualified name.  */
168   D_COMP_QUAL_NAME,
169   /* A local name.  */
170   D_COMP_LOCAL_NAME,
171   /* A typed name.  */
172   D_COMP_TYPED_NAME,
173   /* A template.  */
174   D_COMP_TEMPLATE,
175   /* A template parameter.  */
176   D_COMP_TEMPLATE_PARAM,
177   /* A constructor.  */
178   D_COMP_CTOR,
179   /* A destructor.  */
180   D_COMP_DTOR,
181   /* A vtable.  */
182   D_COMP_VTABLE,
183   /* A VTT structure.  */
184   D_COMP_VTT,
185   /* A construction vtable.  */
186   D_COMP_CONSTRUCTION_VTABLE,
187   /* A typeinfo structure.  */
188   D_COMP_TYPEINFO,
189   /* A typeinfo name.  */
190   D_COMP_TYPEINFO_NAME,
191   /* A typeinfo function.  */
192   D_COMP_TYPEINFO_FN,
193   /* A thunk.  */
194   D_COMP_THUNK,
195   /* A virtual thunk.  */
196   D_COMP_VIRTUAL_THUNK,
197   /* A covariant thunk.  */
198   D_COMP_COVARIANT_THUNK,
199   /* A Java class.  */
200   D_COMP_JAVA_CLASS,
201   /* A guard variable.  */
202   D_COMP_GUARD,
203   /* A reference temporary.  */
204   D_COMP_REFTEMP,
205   /* A standard substitution.  */
206   D_COMP_SUB_STD,
207   /* The restrict qualifier.  */
208   D_COMP_RESTRICT,
209   /* The volatile qualifier.  */
210   D_COMP_VOLATILE,
211   /* The const qualifier.  */
212   D_COMP_CONST,
213   /* The restrict qualifier modifying a member function.  */
214   D_COMP_RESTRICT_THIS,
215   /* The volatile qualifier modifying a member function.  */
216   D_COMP_VOLATILE_THIS,
217   /* The const qualifier modifying a member function.  */
218   D_COMP_CONST_THIS,
219   /* A vendor qualifier.  */
220   D_COMP_VENDOR_TYPE_QUAL,
221   /* A pointer.  */
222   D_COMP_POINTER,
223   /* A reference.  */
224   D_COMP_REFERENCE,
225   /* A complex type.  */
226   D_COMP_COMPLEX,
227   /* An imaginary type.  */
228   D_COMP_IMAGINARY,
229   /* A builtin type.  */
230   D_COMP_BUILTIN_TYPE,
231   /* A vendor's builtin type.  */
232   D_COMP_VENDOR_TYPE,
233   /* A function type.  */
234   D_COMP_FUNCTION_TYPE,
235   /* An array type.  */
236   D_COMP_ARRAY_TYPE,
237   /* A pointer to member type.  */
238   D_COMP_PTRMEM_TYPE,
239   /* An argument list.  */
240   D_COMP_ARGLIST,
241   /* A template argument list.  */
242   D_COMP_TEMPLATE_ARGLIST,
243   /* An operator.  */
244   D_COMP_OPERATOR,
245   /* An extended operator.  */
246   D_COMP_EXTENDED_OPERATOR,
247   /* A typecast.  */
248   D_COMP_CAST,
249   /* A unary expression.  */
250   D_COMP_UNARY,
251   /* A binary expression.  */
252   D_COMP_BINARY,
253   /* Arguments to a binary expression.  */
254   D_COMP_BINARY_ARGS,
255   /* A trinary expression.  */
256   D_COMP_TRINARY,
257   /* Arguments to a trinary expression.  */
258   D_COMP_TRINARY_ARG1,
259   D_COMP_TRINARY_ARG2,
260   /* A literal.  */
261   D_COMP_LITERAL,
262   /* A negative literal.  */
263   D_COMP_LITERAL_NEG
264 };
265
266 /* A component of the mangled name.  */
267
268 struct d_comp
269 {
270   /* The type of this component.  */
271   enum d_comp_type type;
272   union
273   {
274     /* For D_COMP_NAME.  */
275     struct
276     {
277       /* A pointer to the name (not NULL terminated) and it's
278          length.  */
279       const char *s;
280       int len;
281     } s_name;
282
283     /* For D_COMP_OPERATOR.  */
284     struct
285     {
286       /* Operator.  */
287       const struct d_operator_info *op;
288     } s_operator;
289
290     /* For D_COMP_EXTENDED_OPERATOR.  */
291     struct
292     {
293       /* Number of arguments.  */
294       int args;
295       /* Name.  */
296       struct d_comp *name;
297     } s_extended_operator;
298
299     /* For D_COMP_CTOR.  */
300     struct
301     {
302       enum gnu_v3_ctor_kinds kind;
303       struct d_comp *name;
304     } s_ctor;
305
306     /* For D_COMP_DTOR.  */
307     struct
308     {
309       enum gnu_v3_dtor_kinds kind;
310       struct d_comp *name;
311     } s_dtor;
312
313     /* For D_COMP_BUILTIN_TYPE.  */
314     struct
315     {
316       const struct d_builtin_type_info *type;
317     } s_builtin;
318
319     /* For D_COMP_SUB_STD.  */
320     struct
321     {
322       const char* string;
323     } s_string;
324
325     /* For D_COMP_TEMPLATE_PARAM.  */
326     struct
327     {
328       long number;
329     } s_number;
330
331     /* For other types.  */
332     struct
333     {
334       struct d_comp *left;
335       struct d_comp *right;
336     } s_binary;
337
338   } u;
339 };
340
341 #define d_left(dc) ((dc)->u.s_binary.left)
342 #define d_right(dc) ((dc)->u.s_binary.right)
343
344 /* The information structure we pass around.  */
345
346 struct d_info
347 {
348   /* The string we are demangling.  */
349   const char *s;
350   /* The options passed to the demangler.  */
351   int options;
352   /* The next character in the string to consider.  */
353   const char *n;
354   /* The array of components.  */
355   struct d_comp *comps;
356   /* The index of the next available component.  */
357   int next_comp;
358   /* The number of available component structures.  */
359   int num_comps;
360   /* The array of substitutions.  */
361   struct d_comp **subs;
362   /* The index of the next substitution.  */
363   int next_sub;
364   /* The number of available entries in the subs array.  */
365   int num_subs;
366   /* The last name we saw, for constructors and destructors.  */
367   struct d_comp *last_name;
368 };
369
370 #define d_peek_char(di) (*((di)->n))
371 #define d_peek_next_char(di) ((di)->n[1])
372 #define d_advance(di, i) ((di)->n += (i))
373 #define d_next_char(di) (*((di)->n++))
374 #define d_str(di) ((di)->n)
375
376 /* A list of templates.  This is used while printing.  */
377
378 struct d_print_template
379 {
380   /* Next template on the list.  */
381   struct d_print_template *next;
382   /* This template.  */
383   const struct d_comp *template;
384 };
385
386 /* A list of type modifiers.  This is used while printing.  */
387
388 struct d_print_mod
389 {
390   /* Next modifier on the list.  These are in the reverse of the order
391      in which they appeared in the mangled string.  */
392   struct d_print_mod *next;
393   /* The modifier.  */
394   const struct d_comp *mod;
395   /* Whether this modifier was printed.  */
396   int printed;
397   /* The list of templates which applies to this modifier.  */
398   struct d_print_template *templates;
399 };
400
401 /* We use this structure to hold information during printing.  */
402
403 struct d_print_info
404 {
405   /* The options passed to the demangler.  */
406   int options;
407   /* Buffer holding the result.  */
408   char *buf;
409   /* Current length of data in buffer.  */
410   size_t len;
411   /* Allocated size of buffer.  */
412   size_t alc;
413   /* The current list of templates, if any.  */
414   struct d_print_template *templates;
415   /* The current list of modifiers (e.g., pointer, reference, etc.),
416      if any.  */
417   struct d_print_mod *modifiers;
418   /* Set to 1 if we had a memory allocation failure.  */
419   int allocation_failure;
420 };
421
422 #define d_print_saw_error(dpi) ((dpi)->buf == NULL)
423
424 #define d_append_char(dpi, c) \
425   do \
426     { \
427       if ((dpi)->buf != NULL && (dpi)->len < (dpi)->alc) \
428         (dpi)->buf[(dpi)->len++] = (c); \
429       else \
430         d_print_append_char ((dpi), (c)); \
431     } \
432   while (0)
433
434 #define d_append_buffer(dpi, s, l) \
435   do \
436     { \
437       if ((dpi)->buf != NULL && (dpi)->len + (l) <= (dpi)->alc) \
438         { \
439           memcpy ((dpi)->buf + (dpi)->len, (s), (l)); \
440           (dpi)->len += l; \
441         } \
442       else \
443         d_print_append_buffer ((dpi), (s), (l)); \
444     } \
445   while (0)
446
447 #define d_append_string(dpi, s) \
448   do \
449     { \
450       size_t d_append_string_len = strlen (s); \
451       d_append_buffer ((dpi), (s), d_append_string_len); \
452     } \
453   while (0)
454
455 #define d_last_char(dpi) \
456   ((dpi)->buf == NULL || (dpi)->len == 0 ? '\0' : (dpi)->buf[(dpi)->len - 1])
457
458 #ifdef CP_DEMANGLE_DEBUG
459 static void d_dump PARAMS ((struct d_comp *, int));
460 #endif
461 static struct d_comp *d_make_empty PARAMS ((struct d_info *,
462                                             enum d_comp_type));
463 static struct d_comp *d_make_comp PARAMS ((struct d_info *, enum d_comp_type,
464                                            struct d_comp *, struct d_comp *));
465 static struct d_comp *d_make_name PARAMS ((struct d_info *, const char *,
466                                            int));
467 static struct d_comp *d_make_builtin_type PARAMS ((struct d_info *,
468                                                    const struct d_builtin_type_info *));
469 static struct d_comp *d_make_operator PARAMS ((struct d_info *,
470                                                const struct d_operator_info *));
471 static struct d_comp *d_make_extended_operator PARAMS ((struct d_info *,
472                                                         int,
473                                                         struct d_comp *));
474 static struct d_comp *d_make_ctor PARAMS ((struct d_info *,
475                                            enum gnu_v3_ctor_kinds,
476                                            struct d_comp *));
477 static struct d_comp *d_make_dtor PARAMS ((struct d_info *,
478                                            enum gnu_v3_dtor_kinds,
479                                            struct d_comp *));
480 static struct d_comp *d_make_template_param PARAMS ((struct d_info *, long));
481 static struct d_comp *d_make_sub PARAMS ((struct d_info *, const char *));
482 static struct d_comp *d_mangled_name PARAMS ((struct d_info *, int));
483 static int has_return_type PARAMS ((struct d_comp *));
484 static int is_ctor_dtor_or_conversion PARAMS ((struct d_comp *));
485 static struct d_comp *d_encoding PARAMS ((struct d_info *, int));
486 static struct d_comp *d_name PARAMS ((struct d_info *));
487 static struct d_comp *d_nested_name PARAMS ((struct d_info *));
488 static struct d_comp *d_prefix PARAMS ((struct d_info *));
489 static struct d_comp *d_unqualified_name PARAMS ((struct d_info *));
490 static struct d_comp *d_source_name PARAMS ((struct d_info *));
491 static long d_number PARAMS ((struct d_info *));
492 static struct d_comp *d_identifier PARAMS ((struct d_info *, int));
493 static struct d_comp *d_operator_name PARAMS ((struct d_info *));
494 static struct d_comp *d_special_name PARAMS ((struct d_info *));
495 static int d_call_offset PARAMS ((struct d_info *, int));
496 static struct d_comp *d_ctor_dtor_name PARAMS ((struct d_info *));
497 static struct d_comp *d_type PARAMS ((struct d_info *));
498 static struct d_comp **d_cv_qualifiers PARAMS ((struct d_info *,
499                                                 struct d_comp **, int));
500 static struct d_comp *d_function_type PARAMS ((struct d_info *));
501 static struct d_comp *d_bare_function_type PARAMS ((struct d_info *, int));
502 static struct d_comp *d_class_enum_type PARAMS ((struct d_info *));
503 static struct d_comp *d_array_type PARAMS ((struct d_info *));
504 static struct d_comp *d_pointer_to_member_type PARAMS ((struct d_info *));
505 static struct d_comp *d_template_param PARAMS ((struct d_info *));
506 static struct d_comp *d_template_args PARAMS ((struct d_info *));
507 static struct d_comp *d_template_arg PARAMS ((struct d_info *));
508 static struct d_comp *d_expression PARAMS ((struct d_info *));
509 static struct d_comp *d_expr_primary PARAMS ((struct d_info *));
510 static struct d_comp *d_local_name PARAMS ((struct d_info *));
511 static int d_discriminator PARAMS ((struct d_info *));
512 static int d_add_substitution PARAMS ((struct d_info *, struct d_comp *));
513 static struct d_comp *d_substitution PARAMS ((struct d_info *, int));
514 static void d_print_resize PARAMS ((struct d_print_info *, size_t));
515 static void d_print_append_char PARAMS ((struct d_print_info *, int));
516 static void d_print_append_buffer PARAMS ((struct d_print_info *, const char *,
517                                            size_t));
518 static void d_print_error PARAMS ((struct d_print_info *));
519 static char *d_print PARAMS ((int, const struct d_comp *, size_t *));
520 static void d_print_comp PARAMS ((struct d_print_info *,
521                                   const struct d_comp *));
522 static void d_print_identifier PARAMS ((struct d_print_info *, const char *,
523                                         int));
524 static void d_print_mod_list PARAMS ((struct d_print_info *,
525                                       struct d_print_mod *, int));
526 static void d_print_mod PARAMS ((struct d_print_info *,
527                                  const struct d_comp *));
528 static void d_print_function_type PARAMS ((struct d_print_info *,
529                                            const struct d_comp *,
530                                            struct d_print_mod *));
531 static void d_print_array_type PARAMS ((struct d_print_info *,
532                                         const struct d_comp *,
533                                         struct d_print_mod *));
534 static void d_print_expr_op PARAMS ((struct d_print_info *,
535                                      const struct d_comp *));
536 static void d_print_cast PARAMS ((struct d_print_info *,
537                                   const struct d_comp *));
538 static int d_init_info PARAMS ((const char *, int, size_t, struct d_info *));
539 static char *d_demangle PARAMS ((const char *, int, size_t *));
540
541 #ifdef CP_DEMANGLE_DEBUG
542
543 static void
544 d_dump (dc, indent)
545      struct d_comp *dc;
546      int indent;
547 {
548   int i;
549
550   if (dc == NULL)
551     return;
552
553   for (i = 0; i < indent; ++i)
554     putchar (' ');
555
556   switch (dc->type)
557     {
558     case D_COMP_NAME:
559       printf ("name '%.*s'\n", dc->u.s_name.len, dc->u.s_name.s);
560       return;
561     case D_COMP_TEMPLATE_PARAM:
562       printf ("template parameter %ld\n", dc->u.s_number.number);
563       return;
564     case D_COMP_CTOR:
565       printf ("constructor %d\n", (int) dc->u.s_ctor.kind);
566       d_dump (dc->u.s_ctor.name, indent + 2);
567       return;
568     case D_COMP_DTOR:
569       printf ("destructor %d\n", (int) dc->u.s_dtor.kind);
570       d_dump (dc->u.s_dtor.name, indent + 2);
571       return;
572     case D_COMP_SUB_STD:
573       printf ("standard substitution %s\n", dc->u.s_string.string);
574       return;
575     case D_COMP_BUILTIN_TYPE:
576       printf ("builtin type %s\n", dc->u.s_builtin.type->name);
577       return;
578     case D_COMP_OPERATOR:
579       printf ("operator %s\n", dc->u.s_operator.op->name);
580       return;
581     case D_COMP_EXTENDED_OPERATOR:
582       printf ("extended operator with %d args\n",
583               dc->u.s_extended_operator.args);
584       d_dump (dc->u.s_extended_operator.name, indent + 2);
585       return;
586
587     case D_COMP_QUAL_NAME:
588       printf ("qualified name\n");
589       break;
590     case D_COMP_LOCAL_NAME:
591       printf ("local name\n");
592       break;
593     case D_COMP_TYPED_NAME:
594       printf ("typed name\n");
595       break;
596     case D_COMP_TEMPLATE:
597       printf ("template\n");
598       break;
599     case D_COMP_VTABLE:
600       printf ("vtable\n");
601       break;
602     case D_COMP_VTT:
603       printf ("VTT\n");
604       break;
605     case D_COMP_CONSTRUCTION_VTABLE:
606       printf ("construction vtable\n");
607       break;
608     case D_COMP_TYPEINFO:
609       printf ("typeinfo\n");
610       break;
611     case D_COMP_TYPEINFO_NAME:
612       printf ("typeinfo name\n");
613       break;
614     case D_COMP_TYPEINFO_FN:
615       printf ("typeinfo function\n");
616       break;
617     case D_COMP_THUNK:
618       printf ("thunk\n");
619       break;
620     case D_COMP_VIRTUAL_THUNK:
621       printf ("virtual thunk\n");
622       break;
623     case D_COMP_COVARIANT_THUNK:
624       printf ("covariant thunk\n");
625       break;
626     case D_COMP_JAVA_CLASS:
627       printf ("java class\n");
628       break;
629     case D_COMP_GUARD:
630       printf ("guard\n");
631       break;
632     case D_COMP_REFTEMP:
633       printf ("reference temporary\n");
634       break;
635     case D_COMP_RESTRICT:
636       printf ("restrict\n");
637       break;
638     case D_COMP_VOLATILE:
639       printf ("volatile\n");
640       break;
641     case D_COMP_CONST:
642       printf ("const\n");
643       break;
644     case D_COMP_RESTRICT_THIS:
645       printf ("restrict this\n");
646       break;
647     case D_COMP_VOLATILE_THIS:
648       printf ("volatile this\n");
649       break;
650     case D_COMP_CONST_THIS:
651       printf ("const this\n");
652       break;
653     case D_COMP_VENDOR_TYPE_QUAL:
654       printf ("vendor type qualifier\n");
655       break;
656     case D_COMP_POINTER:
657       printf ("pointer\n");
658       break;
659     case D_COMP_REFERENCE:
660       printf ("reference\n");
661       break;
662     case D_COMP_COMPLEX:
663       printf ("complex\n");
664       break;
665     case D_COMP_IMAGINARY:
666       printf ("imaginary\n");
667       break;
668     case D_COMP_VENDOR_TYPE:
669       printf ("vendor type\n");
670       break;
671     case D_COMP_FUNCTION_TYPE:
672       printf ("function type\n");
673       break;
674     case D_COMP_ARRAY_TYPE:
675       printf ("array type\n");
676       break;
677     case D_COMP_PTRMEM_TYPE:
678       printf ("pointer to member type\n");
679       break;
680     case D_COMP_ARGLIST:
681       printf ("argument list\n");
682       break;
683     case D_COMP_TEMPLATE_ARGLIST:
684       printf ("template argument list\n");
685       break;
686     case D_COMP_CAST:
687       printf ("cast\n");
688       break;
689     case D_COMP_UNARY:
690       printf ("unary operator\n");
691       break;
692     case D_COMP_BINARY:
693       printf ("binary operator\n");
694       break;
695     case D_COMP_BINARY_ARGS:
696       printf ("binary operator arguments\n");
697       break;
698     case D_COMP_TRINARY:
699       printf ("trinary operator\n");
700       break;
701     case D_COMP_TRINARY_ARG1:
702       printf ("trinary operator arguments 1\n");
703       break;
704     case D_COMP_TRINARY_ARG2:
705       printf ("trinary operator arguments 1\n");
706       break;
707     case D_COMP_LITERAL:
708       printf ("literal\n");
709       break;
710     case D_COMP_LITERAL_NEG:
711       printf ("negative literal\n");
712       break;
713     }
714
715   d_dump (d_left (dc), indent + 2);
716   d_dump (d_right (dc), indent + 2);
717 }
718
719 #endif /* CP_DEMANGLE_DEBUG */
720
721 /* Add a new component.  */
722
723 static struct d_comp *
724 d_make_empty (di, type)
725      struct d_info *di;
726      enum d_comp_type type;
727 {
728   struct d_comp *p;
729
730   if (di->next_comp >= di->num_comps)
731     return NULL;
732   p = &di->comps[di->next_comp];
733   p->type = type;
734   ++di->next_comp;
735   return p;
736 }
737
738 /* Add a new generic component.  */
739
740 static struct d_comp *
741 d_make_comp (di, type, left, right)
742      struct d_info *di;
743      enum d_comp_type type;
744      struct d_comp *left;
745      struct d_comp *right;
746 {
747   struct d_comp *p;
748
749   /* We check for errors here.  A typical error would be a NULL return
750      from a subroutine.  We catch those here, and return NULL
751      upward.  */
752   switch (type)
753     {
754       /* These types require two parameters.  */
755     case D_COMP_QUAL_NAME:
756     case D_COMP_LOCAL_NAME:
757     case D_COMP_TYPED_NAME:
758     case D_COMP_TEMPLATE:
759     case D_COMP_VENDOR_TYPE_QUAL:
760     case D_COMP_PTRMEM_TYPE:
761     case D_COMP_UNARY:
762     case D_COMP_BINARY:
763     case D_COMP_BINARY_ARGS:
764     case D_COMP_TRINARY:
765     case D_COMP_TRINARY_ARG1:
766     case D_COMP_TRINARY_ARG2:
767     case D_COMP_LITERAL:
768     case D_COMP_LITERAL_NEG:
769       if (left == NULL || right == NULL)
770         return NULL;
771       break;
772
773       /* These types only require one parameter.  */
774     case D_COMP_VTABLE:
775     case D_COMP_VTT:
776     case D_COMP_CONSTRUCTION_VTABLE:
777     case D_COMP_TYPEINFO:
778     case D_COMP_TYPEINFO_NAME:
779     case D_COMP_TYPEINFO_FN:
780     case D_COMP_THUNK:
781     case D_COMP_VIRTUAL_THUNK:
782     case D_COMP_COVARIANT_THUNK:
783     case D_COMP_JAVA_CLASS:
784     case D_COMP_GUARD:
785     case D_COMP_REFTEMP:
786     case D_COMP_POINTER:
787     case D_COMP_REFERENCE:
788     case D_COMP_COMPLEX:
789     case D_COMP_IMAGINARY:
790     case D_COMP_VENDOR_TYPE:
791     case D_COMP_ARGLIST:
792     case D_COMP_TEMPLATE_ARGLIST:
793     case D_COMP_CAST:
794       if (left == NULL)
795         return NULL;
796       break;
797
798       /* This needs a right parameter, but the left parameter can be
799          empty.  */
800     case D_COMP_ARRAY_TYPE:
801       if (right == NULL)
802         return NULL;
803       break;
804
805       /* These are allowed to have no parameters--in some cases they
806          will be filled in later.  */
807     case D_COMP_FUNCTION_TYPE:
808     case D_COMP_RESTRICT:
809     case D_COMP_VOLATILE:
810     case D_COMP_CONST:
811     case D_COMP_RESTRICT_THIS:
812     case D_COMP_VOLATILE_THIS:
813     case D_COMP_CONST_THIS:
814       break;
815
816       /* Other types should not be seen here.  */
817     default:
818       return NULL;
819     }
820
821   p = d_make_empty (di, type);
822   if (p != NULL)
823     {
824       p->u.s_binary.left = left;
825       p->u.s_binary.right = right;
826     }
827   return p;
828 }
829
830 /* Add a new name component.  */
831
832 static struct d_comp *
833 d_make_name (di, s, len)
834      struct d_info *di;
835      const char *s;
836      int len;
837 {
838   struct d_comp *p;
839
840   if (s == NULL || len == 0)
841     return NULL;
842   p = d_make_empty (di, D_COMP_NAME);
843   if (p != NULL)
844     {
845       p->u.s_name.s = s;
846       p->u.s_name.len = len;
847     }
848   return p;
849 }
850
851 /* Add a new builtin type component.  */
852
853 static struct d_comp *
854 d_make_builtin_type (di, type)
855      struct d_info *di;
856      const struct d_builtin_type_info *type;
857 {
858   struct d_comp *p;
859
860   if (type == NULL)
861     return NULL;
862   p = d_make_empty (di, D_COMP_BUILTIN_TYPE);
863   if (p != NULL)
864     p->u.s_builtin.type = type;
865   return p;
866 }
867
868 /* Add a new operator component.  */
869
870 static struct d_comp *
871 d_make_operator (di, op)
872      struct d_info *di;
873      const struct d_operator_info *op;
874 {
875   struct d_comp *p;
876
877   p = d_make_empty (di, D_COMP_OPERATOR);
878   if (p != NULL)
879     p->u.s_operator.op = op;
880   return p;
881 }
882
883 /* Add a new extended operator component.  */
884
885 static struct d_comp *
886 d_make_extended_operator (di, args, name)
887      struct d_info *di;
888      int args;
889      struct d_comp *name;
890 {
891   struct d_comp *p;
892
893   if (name == NULL)
894     return NULL;
895   p = d_make_empty (di, D_COMP_EXTENDED_OPERATOR);
896   if (p != NULL)
897     {
898       p->u.s_extended_operator.args = args;
899       p->u.s_extended_operator.name = name;
900     }
901   return p;
902 }
903
904 /* Add a new constructor component.  */
905
906 static struct d_comp *
907 d_make_ctor (di, kind,  name)
908      struct d_info *di;
909      enum gnu_v3_ctor_kinds kind;
910      struct d_comp *name;
911 {
912   struct d_comp *p;
913
914   if (name == NULL)
915     return NULL;
916   p = d_make_empty (di, D_COMP_CTOR);
917   if (p != NULL)
918     {
919       p->u.s_ctor.kind = kind;
920       p->u.s_ctor.name = name;
921     }
922   return p;
923 }
924
925 /* Add a new destructor component.  */
926
927 static struct d_comp *
928 d_make_dtor (di, kind, name)
929      struct d_info *di;
930      enum gnu_v3_dtor_kinds kind;
931      struct d_comp *name;
932 {
933   struct d_comp *p;
934
935   if (name == NULL)
936     return NULL;
937   p = d_make_empty (di, D_COMP_DTOR);
938   if (p != NULL)
939     {
940       p->u.s_dtor.kind = kind;
941       p->u.s_dtor.name = name;
942     }
943   return p;
944 }
945
946 /* Add a new template parameter.  */
947
948 static struct d_comp *
949 d_make_template_param (di, i)
950      struct d_info *di;
951      long i;
952 {
953   struct d_comp *p;
954
955   p = d_make_empty (di, D_COMP_TEMPLATE_PARAM);
956   if (p != NULL)
957     p->u.s_number.number = i;
958   return p;
959 }
960
961 /* Add a new standard substitution component.  */
962
963 static struct d_comp *
964 d_make_sub (di, name)
965      struct d_info *di;
966      const char *name;
967 {
968   struct d_comp *p;
969
970   p = d_make_empty (di, D_COMP_SUB_STD);
971   if (p != NULL)
972     p->u.s_string.string = name;
973   return p;
974 }
975
976 /* <mangled-name> ::= _Z <encoding>
977
978    TOP_LEVEL is non-zero when called at the top level.  */
979
980 static struct d_comp *
981 d_mangled_name (di, top_level)
982      struct d_info *di;
983      int top_level;
984 {
985   if (d_next_char (di) != '_')
986     return NULL;
987   if (d_next_char (di) != 'Z')
988     return NULL;
989   return d_encoding (di, top_level);
990 }
991
992 /* Return whether a function should have a return type.  The argument
993    is the function name, which may be qualified in various ways.  The
994    rules are that template functions have return types with some
995    exceptions, function types which are not part of a function name
996    mangling have return types with some exceptions, and non-template
997    function names do not have return types.  The exceptions are that
998    constructors, destructors, and conversion operators do not have
999    return types.  */
1000
1001 static int
1002 has_return_type (dc)
1003      struct d_comp *dc;
1004 {
1005   if (dc == NULL)
1006     return 0;
1007   switch (dc->type)
1008     {
1009     default:
1010       return 0;
1011     case D_COMP_TEMPLATE:
1012       return ! is_ctor_dtor_or_conversion (d_left (dc));
1013     case D_COMP_RESTRICT_THIS:
1014     case D_COMP_VOLATILE_THIS:
1015     case D_COMP_CONST_THIS:
1016       return has_return_type (d_left (dc));
1017     }
1018 }
1019
1020 /* Return whether a name is a constructor, a destructor, or a
1021    conversion operator.  */
1022
1023 static int
1024 is_ctor_dtor_or_conversion (dc)
1025      struct d_comp *dc;
1026 {
1027   if (dc == NULL)
1028     return 0;
1029   switch (dc->type)
1030     {
1031     default:
1032       return 0;
1033     case D_COMP_QUAL_NAME:
1034     case D_COMP_LOCAL_NAME:
1035       return is_ctor_dtor_or_conversion (d_right (dc));
1036     case D_COMP_CTOR:
1037     case D_COMP_DTOR:
1038     case D_COMP_CAST:
1039       return 1;
1040     }
1041 }
1042
1043 /* <encoding> ::= <(function) name> <bare-function-type>
1044               ::= <(data) name>
1045               ::= <special-name>
1046
1047    TOP_LEVEL is non-zero when called at the top level, in which case
1048    if DMGL_PARAMS is not set we do not demangle the function
1049    parameters.  We only set this at the top level, because otherwise
1050    we would not correctly demangle names in local scopes.  */
1051
1052 static struct d_comp *
1053 d_encoding (di, top_level)
1054      struct d_info *di;
1055      int top_level;
1056 {
1057   char peek = d_peek_char (di);
1058
1059   if (peek == 'G' || peek == 'T')
1060     return d_special_name (di);
1061   else
1062     {
1063       struct d_comp *dc;
1064
1065       dc = d_name (di);
1066
1067       if (dc != NULL && top_level && (di->options & DMGL_PARAMS) == 0)
1068         {
1069           /* Strip off any initial CV-qualifiers, as they really apply
1070              to the `this' parameter, and they were not output by the
1071              v2 demangler without DMGL_PARAMS.  */
1072           while (dc->type == D_COMP_RESTRICT_THIS
1073                  || dc->type == D_COMP_VOLATILE_THIS
1074                  || dc->type == D_COMP_CONST_THIS)
1075             dc = d_left (dc);
1076           return dc;
1077         }
1078
1079       peek = d_peek_char (di);
1080       if (peek == '\0' || peek == 'E')
1081         return dc;
1082       return d_make_comp (di, D_COMP_TYPED_NAME, dc,
1083                           d_bare_function_type (di, has_return_type (dc)));
1084     }
1085 }
1086
1087 /* <name> ::= <nested-name>
1088           ::= <unscoped-name>
1089           ::= <unscoped-template-name> <template-args>
1090           ::= <local-name>
1091
1092    <unscoped-name> ::= <unqualified-name>
1093                    ::= St <unqualified-name>
1094
1095    <unscoped-template-name> ::= <unscoped-name>
1096                             ::= <substitution>
1097 */
1098
1099 static struct d_comp *
1100 d_name (di)
1101      struct d_info *di;
1102 {
1103   char peek = d_peek_char (di);
1104   struct d_comp *dc;
1105
1106   switch (peek)
1107     {
1108     case 'N':
1109       return d_nested_name (di);
1110
1111     case 'Z':
1112       return d_local_name (di);
1113
1114     case 'S':
1115       {
1116         int subst;
1117
1118         if (d_peek_next_char (di) != 't')
1119           {
1120             dc = d_substitution (di, 0);
1121             subst = 1;
1122           }
1123         else
1124           {
1125             d_advance (di, 2);
1126             dc = d_make_comp (di, D_COMP_QUAL_NAME, d_make_name (di, "std", 3),
1127                               d_unqualified_name (di));
1128             subst = 0;
1129           }
1130
1131         if (d_peek_char (di) != 'I')
1132           {
1133             /* The grammar does not permit this case to occur if we
1134                called d_substitution() above (i.e., subst == 1).  We
1135                don't bother to check.  */
1136           }
1137         else
1138           {
1139             /* This is <template-args>, which means that we just saw
1140                <unscoped-template-name>, which is a substitution
1141                candidate if we didn't just get it from a
1142                substitution.  */
1143             if (! subst)
1144               {
1145                 if (! d_add_substitution (di, dc))
1146                   return NULL;
1147               }
1148             dc = d_make_comp (di, D_COMP_TEMPLATE, dc, d_template_args (di));
1149           }
1150
1151         return dc;
1152       }
1153
1154     default:
1155       dc = d_unqualified_name (di);
1156       if (d_peek_char (di) == 'I')
1157         {
1158           /* This is <template-args>, which means that we just saw
1159              <unscoped-template-name>, which is a substitution
1160              candidate.  */
1161           if (! d_add_substitution (di, dc))
1162             return NULL;
1163           dc = d_make_comp (di, D_COMP_TEMPLATE, dc, d_template_args (di));
1164         }
1165       return dc;
1166     }
1167 }
1168
1169 /* <nested-name> ::= N [<CV-qualifiers>] <prefix> <unqualified-name> E
1170                  ::= N [<CV-qualifiers>] <template-prefix> <template-args> E
1171 */
1172
1173 static struct d_comp *
1174 d_nested_name (di)
1175      struct d_info *di;
1176 {
1177   struct d_comp *ret;
1178   struct d_comp **pret;
1179
1180   if (d_next_char (di) != 'N')
1181     return NULL;
1182
1183   pret = d_cv_qualifiers (di, &ret, 1);
1184   if (pret == NULL)
1185     return NULL;
1186
1187   *pret = d_prefix (di);
1188   if (*pret == NULL)
1189     return NULL;
1190
1191   if (d_next_char (di) != 'E')
1192     return NULL;
1193
1194   return ret;
1195 }
1196
1197 /* <prefix> ::= <prefix> <unqualified-name>
1198             ::= <template-prefix> <template-args>
1199             ::= <template-param>
1200             ::=
1201             ::= <substitution>
1202
1203    <template-prefix> ::= <prefix> <(template) unqualified-name>
1204                      ::= <template-param>
1205                      ::= <substitution>
1206 */
1207
1208 static struct d_comp *
1209 d_prefix (di)
1210      struct d_info *di;
1211 {
1212   struct d_comp *ret = NULL;
1213
1214   while (1)
1215     {
1216       char peek;
1217       enum d_comp_type comb_type;
1218       struct d_comp *dc;
1219
1220       peek = d_peek_char (di);
1221       if (peek == '\0')
1222         return NULL;
1223
1224       /* The older code accepts a <local-name> here, but I don't see
1225          that in the grammar.  The older code does not accept a
1226          <template-param> here.  */
1227
1228       comb_type = D_COMP_QUAL_NAME;
1229       if (IS_DIGIT (peek)
1230           || IS_LOWER (peek)
1231           || peek == 'C'
1232           || peek == 'D')
1233         dc = d_unqualified_name (di);
1234       else if (peek == 'S')
1235         dc = d_substitution (di, 1);
1236       else if (peek == 'I')
1237         {
1238           if (ret == NULL)
1239             return NULL;
1240           comb_type = D_COMP_TEMPLATE;
1241           dc = d_template_args (di);
1242         }
1243       else if (peek == 'T')
1244         dc = d_template_param (di);
1245       else if (peek == 'E')
1246         return ret;
1247       else
1248         return NULL;
1249
1250       if (ret == NULL)
1251         ret = dc;
1252       else
1253         ret = d_make_comp (di, comb_type, ret, dc);
1254
1255       if (peek != 'S' && d_peek_char (di) != 'E')
1256         {
1257           if (! d_add_substitution (di, ret))
1258             return NULL;
1259         }
1260     }
1261 }
1262
1263 /* <unqualified-name> ::= <operator-name>
1264                       ::= <ctor-dtor-name>
1265                       ::= <source-name>
1266 */
1267
1268 static struct d_comp *
1269 d_unqualified_name (di)
1270      struct d_info *di;
1271 {
1272   char peek;
1273
1274   peek = d_peek_char (di);
1275   if (IS_DIGIT (peek))
1276     return d_source_name (di);
1277   else if (IS_LOWER (peek))
1278     return d_operator_name (di);
1279   else if (peek == 'C' || peek == 'D')
1280     return d_ctor_dtor_name (di);
1281   else
1282     return NULL;
1283 }
1284
1285 /* <source-name> ::= <(positive length) number> <identifier>  */
1286
1287 static struct d_comp *
1288 d_source_name (di)
1289      struct d_info *di;
1290 {
1291   long len;
1292   struct d_comp *ret;
1293
1294   len = d_number (di);
1295   if (len <= 0)
1296     return NULL;
1297   ret = d_identifier (di, len);
1298   di->last_name = ret;
1299   return ret;
1300 }
1301
1302 /* number ::= [n] <(non-negative decimal integer)>  */
1303
1304 static long
1305 d_number (di)
1306      struct d_info *di;
1307 {
1308   int sign;
1309   char peek;
1310   long ret;
1311
1312   sign = 1;
1313   peek = d_peek_char (di);
1314   if (peek == 'n')
1315     {
1316       sign = -1;
1317       d_advance (di, 1);
1318       peek = d_peek_char (di);
1319     }
1320
1321   ret = 0;
1322   while (1)
1323     {
1324       if (! IS_DIGIT (peek))
1325         return ret * sign;
1326       ret = ret * 10 + peek - '0';
1327       d_advance (di, 1);
1328       peek = d_peek_char (di);
1329     }
1330 }
1331
1332 /* identifier ::= <(unqualified source code identifier)>  */
1333
1334 static struct d_comp *
1335 d_identifier (di, len)
1336      struct d_info *di;
1337      int len;
1338 {
1339   const char *name;
1340
1341   name = d_str (di);
1342   d_advance (di, len);
1343
1344   /* Look for something which looks like a gcc encoding of an
1345      anonymous namespace, and replace it with a more user friendly
1346      name.  */
1347   if (len >= (int) ANONYMOUS_NAMESPACE_PREFIX_LEN + 2
1348       && memcmp (name, ANONYMOUS_NAMESPACE_PREFIX,
1349                  ANONYMOUS_NAMESPACE_PREFIX_LEN) == 0)
1350     {
1351       const char *s;
1352
1353       s = name + ANONYMOUS_NAMESPACE_PREFIX_LEN;
1354       if ((*s == '.' || *s == '_' || *s == '$')
1355           && s[1] == 'N')
1356         return d_make_name (di, "(anonymous namespace)",
1357                             sizeof "(anonymous namespace)" - 1);
1358     }
1359
1360   return d_make_name (di, name, len);
1361 }
1362
1363 /* operator_name ::= many different two character encodings.
1364                  ::= cv <type>
1365                  ::= v <digit> <source-name>
1366 */
1367
1368 static const struct d_operator_info d_operators[] =
1369 {
1370   { "aN", "&=",        2 },
1371   { "aS", "=",         2 },
1372   { "aa", "&&",        2 },
1373   { "ad", "&",         1 },
1374   { "an", "&",         2 },
1375   { "cl", "()",        0 },
1376   { "cm", ",",         2 },
1377   { "co", "~",         1 },
1378   { "dV", "/=",        2 },
1379   { "da", "delete[]",  1 },
1380   { "de", "*",         1 },
1381   { "dl", "delete",    1 },
1382   { "dv", "/",         2 },
1383   { "eO", "^=",        2 },
1384   { "eo", "^",         2 },
1385   { "eq", "==",        2 },
1386   { "ge", ">=",        2 },
1387   { "gt", ">",         2 },
1388   { "ix", "[]",        2 },
1389   { "lS", "<<=",       2 },
1390   { "le", "<=",        2 },
1391   { "ls", "<<",        2 },
1392   { "lt", "<",         2 },
1393   { "mI", "-=",        2 },
1394   { "mL", "*=",        2 },
1395   { "mi", "-",         2 },
1396   { "ml", "*",         2 },
1397   { "mm", "--",        1 },
1398   { "na", "new[]",     1 },
1399   { "ne", "!=",        2 },
1400   { "ng", "-",         1 },
1401   { "nt", "!",         1 },
1402   { "nw", "new",       1 },
1403   { "oR", "|=",        2 },
1404   { "oo", "||",        2 },
1405   { "or", "|",         2 },
1406   { "pL", "+=",        2 },
1407   { "pl", "+",         2 },
1408   { "pm", "->*",       2 },
1409   { "pp", "++",        1 },
1410   { "ps", "+",         1 },
1411   { "pt", "->",        2 },
1412   { "qu", "?",         3 },
1413   { "rM", "%=",        2 },
1414   { "rS", ">>=",       2 },
1415   { "rm", "%",         2 },
1416   { "rs", ">>",        2 },
1417   { "st", "sizeof ",   1 },
1418   { "sz", "sizeof ",   1 }
1419 };
1420
1421 static struct d_comp *
1422 d_operator_name (di)
1423      struct d_info *di;
1424 {
1425   char c1;
1426   char c2;
1427
1428   c1 = d_next_char (di);
1429   c2 = d_next_char (di);
1430   if (c1 == 'v' && IS_DIGIT (c2))
1431     return d_make_extended_operator (di, c2 - '0', d_source_name (di));
1432   else if (c1 == 'c' && c2 == 'v')
1433     return d_make_comp (di, D_COMP_CAST, d_type (di), NULL);
1434   else
1435     {
1436       int low = 0;
1437       int high = sizeof (d_operators) / sizeof (d_operators[0]);
1438
1439       while (1)
1440         {
1441           int i;
1442           const struct d_operator_info *p;
1443
1444           i = low + (high - low) / 2;
1445           p = d_operators + i;
1446
1447           if (c1 == p->code[0] && c2 == p->code[1])
1448             return d_make_operator (di, p);
1449
1450           if (c1 < p->code[0] || (c1 == p->code[0] && c2 < p->code[1]))
1451             high = i;
1452           else
1453             low = i + 1;
1454           if (low == high)
1455             return NULL;
1456         }
1457     }
1458 }
1459
1460 /* <special-name> ::= TV <type>
1461                   ::= TT <type>
1462                   ::= TI <type>
1463                   ::= TS <type>
1464                   ::= GV <(object) name>
1465                   ::= T <call-offset> <(base) encoding>
1466                   ::= Tc <call-offset> <call-offset> <(base) encoding>
1467    Also g++ extensions:
1468                   ::= TC <type> <(offset) number> _ <(base) type>
1469                   ::= TF <type>
1470                   ::= TJ <type>
1471                   ::= GR <name>
1472 */
1473
1474 static struct d_comp *
1475 d_special_name (di)
1476      struct d_info *di;
1477 {
1478   char c;
1479
1480   c = d_next_char (di);
1481   if (c == 'T')
1482     {
1483       switch (d_next_char (di))
1484         {
1485         case 'V':
1486           return d_make_comp (di, D_COMP_VTABLE, d_type (di), NULL);
1487         case 'T':
1488           return d_make_comp (di, D_COMP_VTT, d_type (di), NULL);
1489         case 'I':
1490           return d_make_comp (di, D_COMP_TYPEINFO, d_type (di), NULL);
1491         case 'S':
1492           return d_make_comp (di, D_COMP_TYPEINFO_NAME, d_type (di), NULL);
1493
1494         case 'h':
1495           if (! d_call_offset (di, 'h'))
1496             return NULL;
1497           return d_make_comp (di, D_COMP_THUNK, d_encoding (di, 0), NULL);
1498
1499         case 'v':
1500           if (! d_call_offset (di, 'v'))
1501             return NULL;
1502           return d_make_comp (di, D_COMP_VIRTUAL_THUNK, d_encoding (di, 0),
1503                               NULL);
1504
1505         case 'c':
1506           if (! d_call_offset (di, '\0'))
1507             return NULL;
1508           if (! d_call_offset (di, '\0'))
1509             return NULL;
1510           return d_make_comp (di, D_COMP_COVARIANT_THUNK, d_encoding (di, 0),
1511                               NULL);
1512
1513         case 'C':
1514           {
1515             struct d_comp *derived_type;
1516             long offset;
1517             struct d_comp *base_type;
1518
1519             derived_type = d_type (di);
1520             offset = d_number (di);
1521             if (offset < 0)
1522               return NULL;
1523             if (d_next_char (di) != '_')
1524               return NULL;
1525             base_type = d_type (di);
1526             /* We don't display the offset.  FIXME: We should display
1527                it in verbose mode.  */
1528             return d_make_comp (di, D_COMP_CONSTRUCTION_VTABLE, base_type,
1529                                 derived_type);
1530           }
1531
1532         case 'F':
1533           return d_make_comp (di, D_COMP_TYPEINFO_FN, d_type (di), NULL);
1534         case 'J':
1535           return d_make_comp (di, D_COMP_JAVA_CLASS, d_type (di), NULL);
1536
1537         default:
1538           return NULL;
1539         }
1540     }
1541   else if (c == 'G')
1542     {
1543       switch (d_next_char (di))
1544         {
1545         case 'V':
1546           return d_make_comp (di, D_COMP_GUARD, d_name (di), NULL);
1547
1548         case 'R':
1549           return d_make_comp (di, D_COMP_REFTEMP, d_name (di), NULL);
1550
1551         default:
1552           return NULL;
1553         }
1554     }
1555   else
1556     return NULL;
1557 }
1558
1559 /* <call-offset> ::= h <nv-offset> _
1560                  ::= v <v-offset> _
1561
1562    <nv-offset> ::= <(offset) number>
1563
1564    <v-offset> ::= <(offset) number> _ <(virtual offset) number>
1565
1566    The C parameter, if not '\0', is a character we just read which is
1567    the start of the <call-offset>.
1568
1569    We don't display the offset information anywhere.  FIXME: We should
1570    display it in verbose mode.  */
1571
1572 static int
1573 d_call_offset (di, c)
1574      struct d_info *di;
1575      int c;
1576 {
1577   long offset;
1578   long virtual_offset;
1579
1580   if (c == '\0')
1581     c = d_next_char (di);
1582
1583   if (c == 'h')
1584     offset = d_number (di);
1585   else if (c == 'v')
1586     {
1587       offset = d_number (di);
1588       if (d_next_char (di) != '_')
1589         return 0;
1590       virtual_offset = d_number (di);
1591     }
1592   else
1593     return 0;
1594
1595   if (d_next_char (di) != '_')
1596     return 0;
1597
1598   return 1;
1599 }
1600
1601 /* <ctor-dtor-name> ::= C1
1602                     ::= C2
1603                     ::= C3
1604                     ::= D0
1605                     ::= D1
1606                     ::= D2
1607 */
1608
1609 static struct d_comp *
1610 d_ctor_dtor_name (di)
1611      struct d_info *di;
1612 {
1613   switch (d_next_char (di))
1614     {
1615     case 'C':
1616       {
1617         enum gnu_v3_ctor_kinds kind;
1618
1619         switch (d_next_char (di))
1620           {
1621           case '1':
1622             kind = gnu_v3_complete_object_ctor;
1623             break;
1624           case '2':
1625             kind = gnu_v3_base_object_ctor;
1626             break;
1627           case '3':
1628             kind = gnu_v3_complete_object_allocating_ctor;
1629             break;
1630           default:
1631             return NULL;
1632           }
1633         return d_make_ctor (di, kind, di->last_name);
1634       }
1635
1636     case 'D':
1637       {
1638         enum gnu_v3_dtor_kinds kind;
1639
1640         switch (d_next_char (di))
1641           {
1642           case '0':
1643             kind = gnu_v3_deleting_dtor;
1644             break;
1645           case '1':
1646             kind = gnu_v3_complete_object_dtor;
1647             break;
1648           case '2':
1649             kind = gnu_v3_base_object_dtor;
1650             break;
1651           default:
1652             return NULL;
1653           }
1654         return d_make_dtor (di, kind, di->last_name);
1655       }
1656
1657     default:
1658       return NULL;
1659     }
1660 }
1661
1662 /* <type> ::= <builtin-type>
1663           ::= <function-type>
1664           ::= <class-enum-type>
1665           ::= <array-type>
1666           ::= <pointer-to-member-type>
1667           ::= <template-param>
1668           ::= <template-template-param> <template-args>
1669           ::= <substitution>
1670           ::= <CV-qualifiers> <type>
1671           ::= P <type>
1672           ::= R <type>
1673           ::= C <type>
1674           ::= G <type>
1675           ::= U <source-name> <type>
1676
1677    <builtin-type> ::= various one letter codes
1678                   ::= u <source-name>
1679 */
1680
1681 static const struct d_builtin_type_info d_builtin_types[26] =
1682 {
1683   /* a */ { "signed char",      "signed char",          D_PRINT_INT },
1684   /* b */ { "bool",             "boolean",              D_PRINT_BOOL },
1685   /* c */ { "char",             "byte",                 D_PRINT_INT },
1686   /* d */ { "double",           "double",               D_PRINT_DEFAULT },
1687   /* e */ { "long double",      "long double",          D_PRINT_DEFAULT },
1688   /* f */ { "float",            "float",                D_PRINT_DEFAULT },
1689   /* g */ { "__float128",       "__float128",           D_PRINT_DEFAULT },
1690   /* h */ { "unsigned char",    "unsigned char",        D_PRINT_INT },
1691   /* i */ { "int",              "int",                  D_PRINT_INT },
1692   /* j */ { "unsigned int",     "unsigned",             D_PRINT_INT },
1693   /* k */ { NULL,               NULL,                   D_PRINT_DEFAULT },
1694   /* l */ { "long",             "long",                 D_PRINT_LONG },
1695   /* m */ { "unsigned long",    "unsigned long",        D_PRINT_LONG },
1696   /* n */ { "__int128",         "__int128",             D_PRINT_DEFAULT },
1697   /* o */ { "unsigned __int128", "unsigned __int128",   D_PRINT_DEFAULT },
1698   /* p */ { NULL,               NULL,                   D_PRINT_DEFAULT },
1699   /* q */ { NULL,               NULL,                   D_PRINT_DEFAULT },
1700   /* r */ { NULL,               NULL,                   D_PRINT_DEFAULT },
1701   /* s */ { "short",            "short",                D_PRINT_INT },
1702   /* t */ { "unsigned short",   "unsigned short",       D_PRINT_INT },
1703   /* u */ { NULL,               NULL,                   D_PRINT_DEFAULT },
1704   /* v */ { "void",             "void",                 D_PRINT_VOID },
1705   /* w */ { "wchar_t",          "char",                 D_PRINT_INT },
1706   /* x */ { "long long",        "long",                 D_PRINT_DEFAULT },
1707   /* y */ { "unsigned long long", "unsigned long long", D_PRINT_DEFAULT },
1708   /* z */ { "...",              "...",                  D_PRINT_DEFAULT },
1709 };
1710
1711 static struct d_comp *
1712 d_type (di)
1713      struct d_info *di;
1714 {
1715   char peek;
1716   struct d_comp *ret;
1717   int can_subst;
1718
1719   /* The ABI specifies that when CV-qualifiers are used, the base type
1720      is substitutable, and the fully qualified type is substitutable,
1721      but the base type with a strict subset of the CV-qualifiers is
1722      not substitutable.  The natural recursive implementation of the
1723      CV-qualifiers would cause subsets to be substitutable, so instead
1724      we pull them all off now.
1725
1726      FIXME: The ABI says that order-insensitive vendor qualifiers
1727      should be handled in the same way, but we have no way to tell
1728      which vendor qualifiers are order-insensitive and which are
1729      order-sensitive.  So we just assume that they are all
1730      order-sensitive.  g++ 3.4 supports only one vendor qualifier,
1731      __vector, and it treats it as order-sensitive when mangling
1732      names.  */
1733
1734   peek = d_peek_char (di);
1735   if (peek == 'r' || peek == 'V' || peek == 'K')
1736     {
1737       struct d_comp **pret;
1738
1739       pret = d_cv_qualifiers (di, &ret, 0);
1740       if (pret == NULL)
1741         return NULL;
1742       *pret = d_type (di);
1743       if (! d_add_substitution (di, ret))
1744         return NULL;
1745       return ret;
1746     }
1747
1748   can_subst = 1;
1749
1750   switch (peek)
1751     {
1752     case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
1753     case 'h': case 'i': case 'j':           case 'l': case 'm': case 'n':
1754     case 'o':                               case 's': case 't':
1755     case 'v': case 'w': case 'x': case 'y': case 'z':
1756       ret = d_make_builtin_type (di, &d_builtin_types[peek - 'a']);
1757       can_subst = 0;
1758       d_advance (di, 1);
1759       break;
1760
1761     case 'u':
1762       d_advance (di, 1);
1763       ret = d_make_comp (di, D_COMP_VENDOR_TYPE, d_source_name (di), NULL);
1764       break;
1765
1766     case 'F':
1767       ret = d_function_type (di);
1768       break;
1769
1770     case '0': case '1': case '2': case '3': case '4':
1771     case '5': case '6': case '7': case '8': case '9':
1772     case 'N':
1773     case 'Z':
1774       ret = d_class_enum_type (di);
1775       break;
1776
1777     case 'A':
1778       ret = d_array_type (di);
1779       break;
1780
1781     case 'M':
1782       ret = d_pointer_to_member_type (di);
1783       break;
1784
1785     case 'T':
1786       ret = d_template_param (di);
1787       if (d_peek_char (di) == 'I')
1788         {
1789           /* This is <template-template-param> <template-args>.  The
1790              <template-template-param> part is a substitution
1791              candidate.  */
1792           if (! d_add_substitution (di, ret))
1793             return NULL;
1794           ret = d_make_comp (di, D_COMP_TEMPLATE, ret, d_template_args (di));
1795         }
1796       break;
1797
1798     case 'S':
1799       /* If this is a special substitution, then it is the start of
1800          <class-enum-type>.  */
1801       {
1802         char peek_next;
1803
1804         peek_next = d_peek_next_char (di);
1805         if (IS_DIGIT (peek_next)
1806             || peek_next == '_'
1807             || IS_UPPER (peek_next))
1808           {
1809             ret = d_substitution (di, 0);
1810             /* The substituted name may have been a template name and
1811                may be followed by tepmlate args.  */
1812             if (d_peek_char (di) == 'I')
1813               ret = d_make_comp (di, D_COMP_TEMPLATE, ret,
1814                                  d_template_args (di));
1815             else
1816               can_subst = 0;
1817           }
1818         else
1819           {
1820             ret = d_class_enum_type (di);
1821             /* If the substitution was a complete type, then it is not
1822                a new substitution candidate.  However, if the
1823                substitution was followed by template arguments, then
1824                the whole thing is a substitution candidate.  */
1825             if (ret != NULL && ret->type == D_COMP_SUB_STD)
1826               can_subst = 0;
1827           }
1828       }
1829       break;
1830
1831     case 'P':
1832       d_advance (di, 1);
1833       ret = d_make_comp (di, D_COMP_POINTER, d_type (di), NULL);
1834       break;
1835
1836     case 'R':
1837       d_advance (di, 1);
1838       ret = d_make_comp (di, D_COMP_REFERENCE, d_type (di), NULL);
1839       break;
1840
1841     case 'C':
1842       d_advance (di, 1);
1843       ret = d_make_comp (di, D_COMP_COMPLEX, d_type (di), NULL);
1844       break;
1845
1846     case 'G':
1847       d_advance (di, 1);
1848       ret = d_make_comp (di, D_COMP_IMAGINARY, d_type (di), NULL);
1849       break;
1850
1851     case 'U':
1852       d_advance (di, 1);
1853       ret = d_source_name (di);
1854       ret = d_make_comp (di, D_COMP_VENDOR_TYPE_QUAL, d_type (di), ret);
1855       break;
1856
1857     default:
1858       return NULL;
1859     }
1860
1861   if (can_subst)
1862     {
1863       if (! d_add_substitution (di, ret))
1864         return NULL;
1865     }
1866
1867   return ret;
1868 }
1869
1870 /* <CV-qualifiers> ::= [r] [V] [K]  */
1871
1872 static struct d_comp **
1873 d_cv_qualifiers (di, pret, member_fn)
1874      struct d_info *di;
1875      struct d_comp **pret;
1876      int member_fn;
1877 {
1878   char peek;
1879
1880   peek = d_peek_char (di);
1881   while (peek == 'r' || peek == 'V' || peek == 'K')
1882     {
1883       enum d_comp_type t;
1884
1885       d_advance (di, 1);
1886       if (peek == 'r')
1887         t = member_fn ? D_COMP_RESTRICT_THIS: D_COMP_RESTRICT;
1888       else if (peek == 'V')
1889         t = member_fn ? D_COMP_VOLATILE_THIS : D_COMP_VOLATILE;
1890       else
1891         t = member_fn ? D_COMP_CONST_THIS: D_COMP_CONST;
1892
1893       *pret = d_make_comp (di, t, NULL, NULL);
1894       if (*pret == NULL)
1895         return NULL;
1896       pret = &d_left (*pret);
1897
1898       peek = d_peek_char (di);
1899     }
1900
1901   return pret;
1902 }
1903
1904 /* <function-type> ::= F [Y] <bare-function-type> E  */
1905
1906 static struct d_comp *
1907 d_function_type (di)
1908      struct d_info *di;
1909 {
1910   struct d_comp *ret;
1911
1912   if (d_next_char (di) != 'F')
1913     return NULL;
1914   if (d_peek_char (di) == 'Y')
1915     {
1916       /* Function has C linkage.  We don't print this information.
1917          FIXME: We should print it in verbose mode.  */
1918       d_advance (di, 1);
1919     }
1920   ret = d_bare_function_type (di, 1);
1921   if (d_next_char (di) != 'E')
1922     return NULL;
1923   return ret;
1924 }
1925
1926 /* <bare-function-type> ::= <type>+  */
1927
1928 static struct d_comp *
1929 d_bare_function_type (di, has_return_type)
1930      struct d_info *di;
1931      int has_return_type;
1932 {
1933   struct d_comp *return_type;
1934   struct d_comp *tl;
1935   struct d_comp **ptl;
1936
1937   return_type = NULL;
1938   tl = NULL;
1939   ptl = &tl;
1940   while (1)
1941     {
1942       char peek;
1943       struct d_comp *type;
1944
1945       peek = d_peek_char (di);
1946       if (peek == '\0' || peek == 'E')
1947         break;
1948       type = d_type (di);
1949       if (type == NULL)
1950         return NULL;
1951       if (has_return_type)
1952         {
1953           return_type = type;
1954           has_return_type = 0;
1955         }
1956       else
1957         {
1958           *ptl = d_make_comp (di, D_COMP_ARGLIST, type, NULL);
1959           if (*ptl == NULL)
1960             return NULL;
1961           ptl = &d_right (*ptl);
1962         }
1963     }
1964
1965   /* There should be at least one parameter type besides the optional
1966      return type.  A function which takes no arguments will have a
1967      single parameter type void.  */
1968   if (tl == NULL)
1969     return NULL;
1970
1971   /* If we have a single parameter type void, omit it.  */
1972   if (d_right (tl) == NULL
1973       && d_left (tl)->type == D_COMP_BUILTIN_TYPE
1974       && d_left (tl)->u.s_builtin.type->print == D_PRINT_VOID)
1975     tl = NULL;
1976
1977   return d_make_comp (di, D_COMP_FUNCTION_TYPE, return_type, tl);
1978 }
1979
1980 /* <class-enum-type> ::= <name>  */
1981
1982 static struct d_comp *
1983 d_class_enum_type (di)
1984      struct d_info *di;
1985 {
1986   return d_name (di);
1987 }
1988
1989 /* <array-type> ::= A <(positive dimension) number> _ <(element) type>
1990                 ::= A [<(dimension) expression>] _ <(element) type>
1991 */
1992
1993 static struct d_comp *
1994 d_array_type (di)
1995      struct d_info *di;
1996 {
1997   char peek;
1998   struct d_comp *dim;
1999
2000   if (d_next_char (di) != 'A')
2001     return NULL;
2002
2003   peek = d_peek_char (di);
2004   if (peek == '_')
2005     dim = NULL;
2006   else if (IS_DIGIT (peek))
2007     {
2008       const char *s;
2009
2010       s = d_str (di);
2011       do
2012         {
2013           d_advance (di, 1);
2014           peek = d_peek_char (di);
2015         }
2016       while (IS_DIGIT (peek));
2017       dim = d_make_name (di, s, d_str (di) - s);
2018       if (dim == NULL)
2019         return NULL;
2020     }
2021   else
2022     {
2023       dim = d_expression (di);
2024       if (dim == NULL)
2025         return NULL;
2026     }
2027
2028   if (d_next_char (di) != '_')
2029     return NULL;
2030
2031   return d_make_comp (di, D_COMP_ARRAY_TYPE, dim, d_type (di));
2032 }
2033
2034 /* <pointer-to-member-type> ::= M <(class) type> <(member) type>  */
2035
2036 static struct d_comp *
2037 d_pointer_to_member_type (di)
2038      struct d_info *di;
2039 {
2040   struct d_comp *cl;
2041   struct d_comp *mem;
2042   struct d_comp **pmem;
2043
2044   if (d_next_char (di) != 'M')
2045     return NULL;
2046
2047   cl = d_type (di);
2048
2049   /* The ABI specifies that any type can be a substitution source, and
2050      that M is followed by two types, and that when a CV-qualified
2051      type is seen both the base type and the CV-qualified types are
2052      substitution sources.  The ABI also specifies that for a pointer
2053      to a CV-qualified member function, the qualifiers are attached to
2054      the second type.  Given the grammar, a plain reading of the ABI
2055      suggests that both the CV-qualified member function and the
2056      non-qualified member function are substitution sources.  However,
2057      g++ does not work that way.  g++ treats only the CV-qualified
2058      member function as a substitution source.  FIXME.  So to work
2059      with g++, we need to pull off the CV-qualifiers here, in order to
2060      avoid calling add_substitution() in d_type().  */
2061
2062   pmem = d_cv_qualifiers (di, &mem, 1);
2063   if (pmem == NULL)
2064     return NULL;
2065   *pmem = d_type (di);
2066
2067   return d_make_comp (di, D_COMP_PTRMEM_TYPE, cl, mem);
2068 }
2069
2070 /* <template-param> ::= T_
2071                     ::= T <(parameter-2 non-negative) number> _
2072 */
2073
2074 static struct d_comp *
2075 d_template_param (di)
2076      struct d_info *di;
2077 {
2078   long param;
2079
2080   if (d_next_char (di) != 'T')
2081     return NULL;
2082
2083   if (d_peek_char (di) == '_')
2084     param = 0;
2085   else
2086     {
2087       param = d_number (di);
2088       if (param < 0)
2089         return NULL;
2090       param += 1;
2091     }
2092
2093   if (d_next_char (di) != '_')
2094     return NULL;
2095
2096   return d_make_template_param (di, param);
2097 }
2098
2099 /* <template-args> ::= I <template-arg>+ E  */
2100
2101 static struct d_comp *
2102 d_template_args (di)
2103      struct d_info *di;
2104 {
2105   struct d_comp *hold_last_name;
2106   struct d_comp *al;
2107   struct d_comp **pal;
2108
2109   /* Preserve the last name we saw--don't let the template arguments
2110      clobber it, as that would give us the wrong name for a subsequent
2111      constructor or destructor.  */
2112   hold_last_name = di->last_name;
2113
2114   if (d_next_char (di) != 'I')
2115     return NULL;
2116
2117   al = NULL;
2118   pal = &al;
2119   while (1)
2120     {
2121       struct d_comp *a;
2122
2123       a = d_template_arg (di);
2124       if (a == NULL)
2125         return NULL;
2126
2127       *pal = d_make_comp (di, D_COMP_TEMPLATE_ARGLIST, a, NULL);
2128       if (*pal == NULL)
2129         return NULL;
2130       pal = &d_right (*pal);
2131
2132       if (d_peek_char (di) == 'E')
2133         {
2134           d_advance (di, 1);
2135           break;
2136         }
2137     }
2138
2139   di->last_name = hold_last_name;
2140
2141   return al;
2142 }
2143
2144 /* <template-arg> ::= <type>
2145                   ::= X <expression> E
2146                   ::= <expr-primary>
2147 */
2148
2149 static struct d_comp *
2150 d_template_arg (di)
2151      struct d_info *di;
2152 {
2153   struct d_comp *ret;
2154
2155   switch (d_peek_char (di))
2156     {
2157     case 'X':
2158       d_advance (di, 1);
2159       ret = d_expression (di);
2160       if (d_next_char (di) != 'E')
2161         return NULL;
2162       return ret;
2163
2164     case 'L':
2165       return d_expr_primary (di);
2166
2167     default:
2168       return d_type (di);
2169     }
2170 }
2171
2172 /* <expression> ::= <(unary) operator-name> <expression>
2173                 ::= <(binary) operator-name> <expression> <expression>
2174                 ::= <(trinary) operator-name> <expression> <expression> <expression>
2175                 ::= st <type>
2176                 ::= <template-param>
2177                 ::= sr <type> <unqualified-name>
2178                 ::= sr <type> <unqualified-name> <template-args>
2179                 ::= <expr-primary>
2180 */
2181
2182 static struct d_comp *
2183 d_expression (di)
2184      struct d_info *di;
2185 {
2186   char peek;
2187
2188   peek = d_peek_char (di);
2189   if (peek == 'L')
2190     return d_expr_primary (di);
2191   else if (peek == 'T')
2192     return d_template_param (di);
2193   else if (peek == 's' && d_peek_next_char (di) == 'r')
2194     {
2195       struct d_comp *type;
2196       struct d_comp *name;
2197
2198       d_advance (di, 2);
2199       type = d_type (di);
2200       name = d_unqualified_name (di);
2201       if (d_peek_char (di) != 'I')
2202         return d_make_comp (di, D_COMP_QUAL_NAME, type, name);
2203       else
2204         return d_make_comp (di, D_COMP_QUAL_NAME, type,
2205                             d_make_comp (di, D_COMP_TEMPLATE, name,
2206                                          d_template_args (di)));
2207     }
2208   else
2209     {
2210       struct d_comp *op;
2211       int args;
2212
2213       op = d_operator_name (di);
2214       if (op == NULL)
2215         return NULL;
2216
2217       if (op->type == D_COMP_OPERATOR
2218           && strcmp (op->u.s_operator.op->code, "st") == 0)
2219         return d_make_comp (di, D_COMP_UNARY, op, d_type (di));
2220
2221       switch (op->type)
2222         {
2223         default:
2224           return NULL;
2225         case D_COMP_OPERATOR:
2226           args = op->u.s_operator.op->args;
2227           break;
2228         case D_COMP_EXTENDED_OPERATOR:
2229           args = op->u.s_extended_operator.args;
2230           break;
2231         case D_COMP_CAST:
2232           args = 1;
2233           break;
2234         }
2235
2236       switch (args)
2237         {
2238         case 1:
2239           return d_make_comp (di, D_COMP_UNARY, op, d_expression (di));
2240         case 2:
2241           {
2242             struct d_comp *left;
2243
2244             left = d_expression (di);
2245             return d_make_comp (di, D_COMP_BINARY, op,
2246                                 d_make_comp (di, D_COMP_BINARY_ARGS, left,
2247                                              d_expression (di)));
2248           }
2249         case 3:
2250           {
2251             struct d_comp *first;
2252             struct d_comp *second;
2253
2254             first = d_expression (di);
2255             second = d_expression (di);
2256             return d_make_comp (di, D_COMP_TRINARY, op,
2257                                 d_make_comp (di, D_COMP_TRINARY_ARG1, first,
2258                                              d_make_comp (di,
2259                                                           D_COMP_TRINARY_ARG2,
2260                                                           second,
2261                                                           d_expression (di))));
2262           }
2263         default:
2264           return NULL;
2265         }
2266     }
2267 }
2268
2269 /* <expr-primary> ::= L <type> <(value) number> E
2270                   ::= L <type> <(value) float> E
2271                   ::= L <mangled-name> E
2272 */
2273
2274 static struct d_comp *
2275 d_expr_primary (di)
2276      struct d_info *di;
2277 {
2278   struct d_comp *ret;
2279
2280   if (d_next_char (di) != 'L')
2281     return NULL;
2282   if (d_peek_char (di) == '_')
2283     ret = d_mangled_name (di, 0);
2284   else
2285     {
2286       struct d_comp *type;
2287       enum d_comp_type t;
2288       const char *s;
2289
2290       type = d_type (di);
2291
2292       /* Rather than try to interpret the literal value, we just
2293          collect it as a string.  Note that it's possible to have a
2294          floating point literal here.  The ABI specifies that the
2295          format of such literals is machine independent.  That's fine,
2296          but what's not fine is that versions of g++ up to 3.2 with
2297          -fabi-version=1 used upper case letters in the hex constant,
2298          and dumped out gcc's internal representation.  That makes it
2299          hard to tell where the constant ends, and hard to dump the
2300          constant in any readable form anyhow.  We don't attempt to
2301          handle these cases.  */
2302
2303       t = D_COMP_LITERAL;
2304       if (d_peek_char (di) == 'n')
2305         {
2306           t = D_COMP_LITERAL_NEG;
2307           d_advance (di, 1);
2308         }
2309       s = d_str (di);
2310       while (d_peek_char (di) != 'E')
2311         d_advance (di, 1);
2312       ret = d_make_comp (di, t, type, d_make_name (di, s, d_str (di) - s));
2313     }
2314   if (d_next_char (di) != 'E')
2315     return NULL;
2316   return ret;
2317 }
2318
2319 /* <local-name> ::= Z <(function) encoding> E <(entity) name> [<discriminator>]
2320                 ::= Z <(function) encoding> E s [<discriminator>]
2321 */
2322
2323 static struct d_comp *
2324 d_local_name (di)
2325      struct d_info *di;
2326 {
2327   struct d_comp *function;
2328
2329   if (d_next_char (di) != 'Z')
2330     return NULL;
2331
2332   function = d_encoding (di, 0);
2333
2334   if (d_next_char (di) != 'E')
2335     return NULL;
2336
2337   if (d_peek_char (di) == 's')
2338     {
2339       d_advance (di, 1);
2340       if (! d_discriminator (di))
2341         return NULL;
2342       return d_make_comp (di, D_COMP_LOCAL_NAME, function,
2343                           d_make_name (di, "string literal",
2344                                        sizeof "string literal" - 1));
2345     }
2346   else
2347     {
2348       struct d_comp *name;
2349
2350       name = d_name (di);
2351       if (! d_discriminator (di))
2352         return NULL;
2353       return d_make_comp (di, D_COMP_LOCAL_NAME, function, name);
2354     }
2355 }
2356
2357 /* <discriminator> ::= _ <(non-negative) number>
2358
2359    We demangle the discriminator, but we don't print it out.  FIXME:
2360    We should print it out in verbose mode.  */
2361
2362 static int
2363 d_discriminator (di)
2364      struct d_info *di;
2365 {
2366   long discrim;
2367
2368   if (d_peek_char (di) != '_')
2369     return 1;
2370   d_advance (di, 1);
2371   discrim = d_number (di);
2372   if (discrim < 0)
2373     return 0;
2374   return 1;
2375 }
2376
2377 /* Add a new substitution.  */
2378
2379 static int
2380 d_add_substitution (di, dc)
2381      struct d_info *di;
2382      struct d_comp *dc;
2383 {
2384   if (dc == NULL)
2385     return 0;
2386   if (di->next_sub >= di->num_subs)
2387     return 0;
2388   di->subs[di->next_sub] = dc;
2389   ++di->next_sub;
2390   return 1;
2391 }
2392
2393 /* <substitution> ::= S <seq-id> _
2394                   ::= S_
2395                   ::= St
2396                   ::= Sa
2397                   ::= Sb
2398                   ::= Ss
2399                   ::= Si
2400                   ::= So
2401                   ::= Sd
2402
2403    If PREFIX is non-zero, then this type is being used as a prefix in
2404    a qualified name.  In this case, for the standard substitutions, we
2405    need to check whether we are being used as a prefix for a
2406    constructor or destructor, and return a full template name.
2407    Otherwise we will get something like std::iostream::~iostream()
2408    which does not correspond particularly well to any function which
2409    actually appears in the source.
2410 */
2411
2412 static const struct d_standard_sub_info standard_subs[] =
2413 {
2414   { 't', "std", "std", NULL },
2415   { 'a', "std::allocator", "std::allocator", "allocator" },
2416   { 'b', "std::basic_string", "std::basic_string", "basic_string" },
2417   { 's', "std::string",
2418     "std::basic_string<char, std::char_traits<char>, std::allocator<char> >",
2419     "basic_string" },
2420   { 'i', "std::istream",
2421     "std::basic_istream<char, std::char_traits<char> >",
2422     "basic_istream" },
2423   { 'o', "std::ostream",
2424     "std::basic_ostream<char, std::char_traits<char> >",
2425     "basic_ostream" },
2426   { 'd', "std::iostream",
2427     "std::basic_iostream<char, std::char_traits<char> >",
2428     "basic_iostream" }
2429 };
2430
2431 static struct d_comp *
2432 d_substitution (di, prefix)
2433      struct d_info *di;
2434      int prefix;
2435 {
2436   char c;
2437
2438   if (d_next_char (di) != 'S')
2439     return NULL;
2440
2441   c = d_next_char (di);
2442   if (c == '_' || IS_DIGIT (c) || IS_UPPER (c))
2443     {
2444       int id;
2445
2446       id = 0;
2447       if (c != '_')
2448         {
2449           do
2450             {
2451               if (IS_DIGIT (c))
2452                 id = id * 36 + c - '0';
2453               else if (IS_UPPER (c))
2454                 id = id * 36 + c - 'A' + 10;
2455               else
2456                 return NULL;
2457               c = d_next_char (di);
2458             }
2459           while (c != '_');
2460
2461           ++id;
2462         }
2463
2464       if (id >= di->next_sub)
2465         return NULL;
2466
2467       return di->subs[id];
2468     }
2469   else
2470     {
2471       int verbose;
2472       const struct d_standard_sub_info *p;
2473       const struct d_standard_sub_info *pend;
2474
2475       verbose = (di->options & DMGL_VERBOSE) != 0;
2476       if (! verbose && prefix)
2477         {
2478           char peek;
2479
2480           peek = d_peek_char (di);
2481           if (peek == 'C' || peek == 'D')
2482             verbose = 1;
2483         }
2484
2485       pend = (&standard_subs[0]
2486               + sizeof standard_subs / sizeof standard_subs[0]);
2487       for (p = &standard_subs[0]; p < pend; ++p)
2488         {
2489           if (c == p->code)
2490             {
2491               if (p->set_last_name != NULL)
2492                 di->last_name = d_make_sub (di, p->set_last_name);
2493               if (verbose)
2494                 return d_make_sub (di, p->full_expansion);
2495               else
2496                 return d_make_sub (di, p->simple_expansion);
2497             }
2498         }
2499
2500       return NULL;
2501     }
2502 }
2503
2504 /* Resize the print buffer.  */
2505
2506 static void
2507 d_print_resize (dpi, add)
2508      struct d_print_info *dpi;
2509      size_t add;
2510 {
2511   size_t need;
2512
2513   if (dpi->buf == NULL)
2514     return;
2515   need = dpi->len + add;
2516   while (need > dpi->alc)
2517     {
2518       size_t newalc;
2519       char *newbuf;
2520
2521       newalc = dpi->alc * 2;
2522       newbuf = realloc (dpi->buf, newalc);
2523       if (newbuf == NULL)
2524         {
2525           free (dpi->buf);
2526           dpi->buf = NULL;
2527           dpi->allocation_failure = 1;
2528           return;
2529         }
2530       dpi->buf = newbuf;
2531       dpi->alc = newalc;
2532     }
2533 }
2534
2535 /* Append a character to the print buffer.  */
2536
2537 static void
2538 d_print_append_char (dpi, c)
2539      struct d_print_info *dpi;
2540      int c;
2541 {
2542   if (dpi->buf != NULL)
2543     {
2544       if (dpi->len >= dpi->alc)
2545         {
2546           d_print_resize (dpi, 1);
2547           if (dpi->buf == NULL)
2548             return;
2549         }
2550
2551       dpi->buf[dpi->len] = c;
2552       ++dpi->len;
2553     }
2554 }
2555
2556 /* Append a buffer to the print buffer.  */
2557
2558 static void
2559 d_print_append_buffer (dpi, s, l)
2560      struct d_print_info *dpi;
2561      const char *s;
2562      size_t l;
2563 {
2564   if (dpi->buf != NULL)
2565     {
2566       if (dpi->len + l > dpi->alc)
2567         {
2568           d_print_resize (dpi, l);
2569           if (dpi->buf == NULL)
2570             return;
2571         }
2572
2573       memcpy (dpi->buf + dpi->len, s, l);
2574       dpi->len += l;
2575     }
2576 }
2577
2578 /* Indicate that an error occurred during printing.  */
2579
2580 static void
2581 d_print_error (dpi)
2582      struct d_print_info *dpi;
2583 {
2584   free (dpi->buf);
2585   dpi->buf = NULL;
2586 }
2587
2588 /* Turn components into a human readable string.  Returns a string
2589    allocated by malloc, or NULL on error.  On success, this sets *PALC
2590    to the size of the allocated buffer.  On failure, this sets *PALC
2591    to 0 for a bad parse, or to 1 for a memory allocation failure.  */
2592
2593 static char *
2594 d_print (options, dc, palc)
2595      int options;
2596      const struct d_comp *dc;
2597      size_t *palc;
2598 {
2599   struct d_print_info dpi;
2600
2601   dpi.options = options;
2602
2603   dpi.alc = 64;
2604   dpi.buf = malloc (dpi.alc);
2605   if (dpi.buf == NULL)
2606     {
2607       *palc = 1;
2608       return NULL;
2609     }
2610
2611   dpi.len = 0;
2612   dpi.templates = NULL;
2613   dpi.modifiers = NULL;
2614
2615   dpi.allocation_failure = 0;
2616
2617   d_print_comp (&dpi, dc);
2618
2619   d_append_char (&dpi, '\0');
2620
2621   if (dpi.buf != NULL)
2622     *palc = dpi.alc;
2623   else
2624     *palc = dpi.allocation_failure;
2625
2626   return dpi.buf;
2627 }
2628
2629 /* Subroutine to handle components.  */
2630
2631 static void
2632 d_print_comp (dpi, dc)
2633      struct d_print_info *dpi;
2634      const struct d_comp *dc;
2635 {
2636   if (dc == NULL)
2637     {
2638       d_print_error (dpi);
2639       return;
2640     }
2641   if (d_print_saw_error (dpi))
2642     return;
2643
2644   switch (dc->type)
2645     {
2646     case D_COMP_NAME:
2647       d_print_identifier (dpi, dc->u.s_name.s, dc->u.s_name.len);
2648       return;
2649
2650     case D_COMP_QUAL_NAME:
2651     case D_COMP_LOCAL_NAME:
2652       d_print_comp (dpi, d_left (dc));
2653       d_append_string (dpi, (dpi->options & DMGL_JAVA) == 0 ? "::" : ".");
2654       d_print_comp (dpi, d_right (dc));
2655       return;
2656
2657     case D_COMP_TYPED_NAME:
2658       {
2659         struct d_print_mod *hold_modifiers;
2660         struct d_comp *typed_name;
2661         struct d_print_mod adpm[4];
2662         unsigned int i;
2663         struct d_print_template dpt;
2664
2665         /* Pass the name down to the type so that it can be printed in
2666            the right place for the type.  We also have to pass down
2667            any CV-qualifiers, which apply to the this parameter.  */
2668         hold_modifiers = dpi->modifiers;
2669         i = 0;
2670         typed_name = d_left (dc);
2671         while (typed_name != NULL)
2672           {
2673             if (i >= sizeof adpm / sizeof adpm[0])
2674               {
2675                 d_print_error (dpi);
2676                 return;
2677               }
2678
2679             adpm[i].next = dpi->modifiers;
2680             dpi->modifiers = &adpm[i];
2681             adpm[i].mod = typed_name;
2682             adpm[i].printed = 0;
2683             adpm[i].templates = dpi->templates;
2684             ++i;
2685
2686             if (typed_name->type != D_COMP_RESTRICT_THIS
2687                 && typed_name->type != D_COMP_VOLATILE_THIS
2688                 && typed_name->type != D_COMP_CONST_THIS)
2689               break;
2690
2691             typed_name = d_left (typed_name);
2692           }
2693
2694         /* If typed_name is a template, then it applies to the
2695            function type as well.  */
2696         if (typed_name->type == D_COMP_TEMPLATE)
2697           {
2698             dpt.next = dpi->templates;
2699             dpi->templates = &dpt;
2700             dpt.template = typed_name;
2701           }
2702
2703         /* If typed_name is a D_COMP_LOCAL_NAME, then there may be
2704            CV-qualifiers on its right argument which really apply
2705            here; this happens when parsing a class which is local to a
2706            function.  */
2707         if (typed_name->type == D_COMP_LOCAL_NAME)
2708           {
2709             struct d_comp *local_name;
2710
2711             local_name = d_right (typed_name);
2712             while (local_name->type == D_COMP_RESTRICT_THIS
2713                    || local_name->type == D_COMP_VOLATILE_THIS
2714                    || local_name->type == D_COMP_CONST_THIS)
2715               {
2716                 if (i >= sizeof adpm / sizeof adpm[0])
2717                   {
2718                     d_print_error (dpi);
2719                     return;
2720                   }
2721
2722                 adpm[i] = adpm[i - 1];
2723                 adpm[i].next = &adpm[i - 1];
2724                 dpi->modifiers = &adpm[i];
2725
2726                 adpm[i - 1].mod = local_name;
2727                 adpm[i - 1].printed = 0;
2728                 adpm[i - 1].templates = dpi->templates;
2729                 ++i;
2730
2731                 local_name = d_left (local_name);
2732               }
2733           }
2734
2735         d_print_comp (dpi, d_right (dc));
2736
2737         if (typed_name->type == D_COMP_TEMPLATE)
2738           dpi->templates = dpt.next;
2739
2740         /* If the modifiers didn't get printed by the type, print them
2741            now.  */
2742         while (i > 0)
2743           {
2744             --i;
2745             if (! adpm[i].printed)
2746               {
2747                 d_append_char (dpi, ' ');
2748                 d_print_mod (dpi, adpm[i].mod);
2749               }
2750           }
2751
2752         dpi->modifiers = hold_modifiers;
2753
2754         return;
2755       }
2756
2757     case D_COMP_TEMPLATE:
2758       {
2759         struct d_print_mod *hold_dpm;
2760
2761         /* Don't push modifiers into a template definition.  Doing so
2762            could give the wrong definition for a template argument.
2763            Instead, treat the template essentially as a name.  */
2764
2765         hold_dpm = dpi->modifiers;
2766         dpi->modifiers = NULL;
2767
2768         d_print_comp (dpi, d_left (dc));
2769         if (d_last_char (dpi) == '<')
2770           d_append_char (dpi, ' ');
2771         d_append_char (dpi, '<');
2772         d_print_comp (dpi, d_right (dc));
2773         /* Avoid generating two consecutive '>' characters, to avoid
2774            the C++ syntactic ambiguity.  */
2775         if (d_last_char (dpi) == '>')
2776           d_append_char (dpi, ' ');
2777         d_append_char (dpi, '>');
2778
2779         dpi->modifiers = hold_dpm;
2780
2781         return;
2782       }
2783
2784     case D_COMP_TEMPLATE_PARAM:
2785       {
2786         long i;
2787         struct d_comp *a;
2788         struct d_print_template *hold_dpt;
2789
2790         if (dpi->templates == NULL)
2791           {
2792             d_print_error (dpi);
2793             return;
2794           }
2795         i = dc->u.s_number.number;
2796         for (a = d_right (dpi->templates->template);
2797              a != NULL;
2798              a = d_right (a))
2799           {
2800             if (a->type != D_COMP_TEMPLATE_ARGLIST)
2801               {
2802                 d_print_error (dpi);
2803                 return;
2804               }
2805             if (i <= 0)
2806               break;
2807             --i;
2808           }
2809         if (i != 0 || a == NULL)
2810           {
2811             d_print_error (dpi);
2812             return;
2813           }
2814
2815         /* While processing this parameter, we need to pop the list of
2816            templates.  This is because the template parameter may
2817            itself be a reference to a parameter of an outer
2818            template.  */
2819
2820         hold_dpt = dpi->templates;
2821         dpi->templates = hold_dpt->next;
2822
2823         d_print_comp (dpi, d_left (a));
2824
2825         dpi->templates = hold_dpt;
2826
2827         return;
2828       }
2829
2830     case D_COMP_CTOR:
2831       d_print_comp (dpi, dc->u.s_ctor.name);
2832       return;
2833
2834     case D_COMP_DTOR:
2835       d_append_char (dpi, '~');
2836       d_print_comp (dpi, dc->u.s_dtor.name);
2837       return;
2838
2839     case D_COMP_VTABLE:
2840       d_append_string (dpi, "vtable for ");
2841       d_print_comp (dpi, d_left (dc));
2842       return;
2843
2844     case D_COMP_VTT:
2845       d_append_string (dpi, "VTT for ");
2846       d_print_comp (dpi, d_left (dc));
2847       return;
2848
2849     case D_COMP_CONSTRUCTION_VTABLE:
2850       d_append_string (dpi, "construction vtable for ");
2851       d_print_comp (dpi, d_left (dc));
2852       d_append_string (dpi, "-in-");
2853       d_print_comp (dpi, d_right (dc));
2854       return;
2855
2856     case D_COMP_TYPEINFO:
2857       d_append_string (dpi, "typeinfo for ");
2858       d_print_comp (dpi, d_left (dc));
2859       return;
2860
2861     case D_COMP_TYPEINFO_NAME:
2862       d_append_string (dpi, "typeinfo name for ");
2863       d_print_comp (dpi, d_left (dc));
2864       return;
2865
2866     case D_COMP_TYPEINFO_FN:
2867       d_append_string (dpi, "typeinfo fn for ");
2868       d_print_comp (dpi, d_left (dc));
2869       return;
2870
2871     case D_COMP_THUNK:
2872       d_append_string (dpi, "non-virtual thunk to ");
2873       d_print_comp (dpi, d_left (dc));
2874       return;
2875
2876     case D_COMP_VIRTUAL_THUNK:
2877       d_append_string (dpi, "virtual thunk to ");
2878       d_print_comp (dpi, d_left (dc));
2879       return;
2880
2881     case D_COMP_COVARIANT_THUNK:
2882       d_append_string (dpi, "covariant return thunk to ");
2883       d_print_comp (dpi, d_left (dc));
2884       return;
2885
2886     case D_COMP_JAVA_CLASS:
2887       d_append_string (dpi, "java Class for ");
2888       d_print_comp (dpi, d_left (dc));
2889       return;
2890
2891     case D_COMP_GUARD:
2892       d_append_string (dpi, "guard variable for ");
2893       d_print_comp (dpi, d_left (dc));
2894       return;
2895
2896     case D_COMP_REFTEMP:
2897       d_append_string (dpi, "reference temporary for ");
2898       d_print_comp (dpi, d_left (dc));
2899       return;
2900
2901     case D_COMP_SUB_STD:
2902       d_append_string (dpi, dc->u.s_string.string);
2903       return;
2904
2905     case D_COMP_RESTRICT:
2906     case D_COMP_VOLATILE:
2907     case D_COMP_CONST:
2908     case D_COMP_RESTRICT_THIS:
2909     case D_COMP_VOLATILE_THIS:
2910     case D_COMP_CONST_THIS:
2911     case D_COMP_VENDOR_TYPE_QUAL:
2912     case D_COMP_POINTER:
2913     case D_COMP_REFERENCE:
2914     case D_COMP_COMPLEX:
2915     case D_COMP_IMAGINARY:
2916       {
2917         /* We keep a list of modifiers on the stack.  */
2918         struct d_print_mod dpm;
2919
2920         dpm.next = dpi->modifiers;
2921         dpi->modifiers = &dpm;
2922         dpm.mod = dc;
2923         dpm.printed = 0;
2924         dpm.templates = dpi->templates;
2925
2926         d_print_comp (dpi, d_left (dc));
2927
2928         /* If the modifier didn't get printed by the type, print it
2929            now.  */
2930         if (! dpm.printed)
2931           d_print_mod (dpi, dc);
2932
2933         dpi->modifiers = dpm.next;
2934
2935         return;
2936       }
2937
2938     case D_COMP_BUILTIN_TYPE:
2939       if ((dpi->options & DMGL_JAVA) == 0)
2940         d_append_string (dpi, dc->u.s_builtin.type->name);
2941       else
2942         d_append_string (dpi, dc->u.s_builtin.type->java_name);
2943       return;
2944
2945     case D_COMP_VENDOR_TYPE:
2946       d_print_comp (dpi, d_left (dc));
2947       return;
2948
2949     case D_COMP_FUNCTION_TYPE:
2950       {
2951         if (d_left (dc) != NULL)
2952           {
2953             struct d_print_mod dpm;
2954
2955             /* We must pass this type down as a modifier in order to
2956                print it in the right location.  */
2957
2958             dpm.next = dpi->modifiers;
2959             dpi->modifiers = &dpm;
2960             dpm.mod = dc;
2961             dpm.printed = 0;
2962             dpm.templates = dpi->templates;
2963
2964             d_print_comp (dpi, d_left (dc));
2965
2966             dpi->modifiers = dpm.next;
2967
2968             if (dpm.printed)
2969               return;
2970
2971             d_append_char (dpi, ' ');
2972           }
2973
2974         d_print_function_type (dpi, dc, dpi->modifiers);
2975
2976         return;
2977       }
2978
2979     case D_COMP_ARRAY_TYPE:
2980       {
2981         struct d_print_mod dpm;
2982
2983         /* We must pass this type down as a modifier in order to print
2984            multi-dimensional arrays correctly.  */
2985
2986         dpm.next = dpi->modifiers;
2987         dpi->modifiers = &dpm;
2988         dpm.mod = dc;
2989         dpm.printed = 0;
2990         dpm.templates = dpi->templates;
2991
2992         d_print_comp (dpi, d_right (dc));
2993
2994         dpi->modifiers = dpm.next;
2995
2996         if (dpm.printed)
2997           return;
2998
2999         d_print_array_type (dpi, dc, dpi->modifiers);
3000
3001         return;
3002       }
3003
3004     case D_COMP_PTRMEM_TYPE:
3005       {
3006         struct d_print_mod dpm;
3007
3008         dpm.next = dpi->modifiers;
3009         dpi->modifiers = &dpm;
3010         dpm.mod = dc;
3011         dpm.printed = 0;
3012         dpm.templates = dpi->templates;
3013
3014         d_print_comp (dpi, d_right (dc));
3015
3016         /* If the modifier didn't get printed by the type, print it
3017            now.  */
3018         if (! dpm.printed)
3019           {
3020             d_append_char (dpi, ' ');
3021             d_print_comp (dpi, d_left (dc));
3022             d_append_string (dpi, "::*");
3023           }
3024
3025         dpi->modifiers = dpm.next;
3026
3027         return;
3028       }
3029
3030     case D_COMP_ARGLIST:
3031     case D_COMP_TEMPLATE_ARGLIST:
3032       d_print_comp (dpi, d_left (dc));
3033       if (d_right (dc) != NULL)
3034         {
3035           d_append_string (dpi, ", ");
3036           d_print_comp (dpi, d_right (dc));
3037         }
3038       return;
3039
3040     case D_COMP_OPERATOR:
3041       {
3042         char c;
3043
3044         d_append_string (dpi, "operator");
3045         c = dc->u.s_operator.op->name[0];
3046         if (IS_LOWER (c))
3047           d_append_char (dpi, ' ');
3048         d_append_string (dpi, dc->u.s_operator.op->name);
3049         return;
3050       }
3051
3052     case D_COMP_EXTENDED_OPERATOR:
3053       d_append_string (dpi, "operator ");
3054       d_print_comp (dpi, dc->u.s_extended_operator.name);
3055       return;
3056
3057     case D_COMP_CAST:
3058       d_append_string (dpi, "operator ");
3059       d_print_cast (dpi, dc);
3060       return;
3061
3062     case D_COMP_UNARY:
3063       if (d_left (dc)->type != D_COMP_CAST)
3064         d_print_expr_op (dpi, d_left (dc));
3065       else
3066         {
3067           d_append_string (dpi, "((");
3068           d_print_cast (dpi, d_left (dc));
3069           d_append_char (dpi, ')');
3070         }
3071       d_append_char (dpi, '(');
3072       d_print_comp (dpi, d_right (dc));
3073       d_append_char (dpi, ')');
3074       if (d_left (dc)->type == D_COMP_CAST)
3075         d_append_char (dpi, ')');
3076       return;
3077
3078     case D_COMP_BINARY:
3079       if (d_right (dc)->type != D_COMP_BINARY_ARGS)
3080         {
3081           d_print_error (dpi);
3082           return;
3083         }
3084
3085       /* We wrap an expression which uses the greater-than operator in
3086          an extra layer of parens so that it does not get confused
3087          with the '>' which ends the template parameters.  */
3088       if (d_left (dc)->type == D_COMP_OPERATOR
3089           && strcmp (d_left (dc)->u.s_operator.op->name, ">") == 0)
3090         d_append_char (dpi, '(');
3091
3092       d_append_char (dpi, '(');
3093       d_print_comp (dpi, d_left (d_right (dc)));
3094       d_append_string (dpi, ") ");
3095       d_print_expr_op (dpi, d_left (dc));
3096       d_append_string (dpi, " (");
3097       d_print_comp (dpi, d_right (d_right (dc)));
3098       d_append_char (dpi, ')');
3099
3100       if (d_left (dc)->type == D_COMP_OPERATOR
3101           && strcmp (d_left (dc)->u.s_operator.op->name, ">") == 0)
3102         d_append_char (dpi, ')');
3103
3104       return;
3105
3106     case D_COMP_BINARY_ARGS:
3107       /* We should only see this as part of D_COMP_BINARY.  */
3108       d_print_error (dpi);
3109       return;
3110
3111     case D_COMP_TRINARY:
3112       if (d_right (dc)->type != D_COMP_TRINARY_ARG1
3113           || d_right (d_right (dc))->type != D_COMP_TRINARY_ARG2)
3114         {
3115           d_print_error (dpi);
3116           return;
3117         }
3118       d_append_char (dpi, '(');
3119       d_print_comp (dpi, d_left (d_right (dc)));
3120       d_append_string (dpi, ") ");
3121       d_print_expr_op (dpi, d_left (dc));
3122       d_append_string (dpi, " (");
3123       d_print_comp (dpi, d_left (d_right (d_right (dc))));
3124       d_append_string (dpi, ") : (");
3125       d_print_comp (dpi, d_right (d_right (d_right (dc))));
3126       d_append_char (dpi, ')');
3127       return;
3128
3129     case D_COMP_TRINARY_ARG1:
3130     case D_COMP_TRINARY_ARG2:
3131       /* We should only see these are part of D_COMP_TRINARY.  */
3132       d_print_error (dpi);
3133       return;
3134
3135     case D_COMP_LITERAL:
3136     case D_COMP_LITERAL_NEG:
3137       /* For some builtin types, produce simpler output.  */
3138       if (d_left (dc)->type == D_COMP_BUILTIN_TYPE)
3139         {
3140           switch (d_left (dc)->u.s_builtin.type->print)
3141             {
3142             case D_PRINT_INT:
3143               if (d_right (dc)->type == D_COMP_NAME)
3144                 {
3145                   if (dc->type == D_COMP_LITERAL_NEG)
3146                     d_append_char (dpi, '-');
3147                   d_print_comp (dpi, d_right (dc));
3148                   return;
3149                 }
3150               break;
3151
3152             case D_PRINT_LONG:
3153               if (d_right (dc)->type == D_COMP_NAME)
3154                 {
3155                   if (dc->type == D_COMP_LITERAL_NEG)
3156                     d_append_char (dpi, '-');
3157                   d_print_comp (dpi, d_right (dc));
3158                   d_append_char (dpi, 'l');
3159                   return;
3160                 }
3161               break;
3162
3163             case D_PRINT_BOOL:
3164               if (d_right (dc)->type == D_COMP_NAME
3165                   && d_right (dc)->u.s_name.len == 1
3166                   && dc->type == D_COMP_LITERAL)
3167                 {
3168                   switch (d_right (dc)->u.s_name.s[0])
3169                     {
3170                     case '0':
3171                       d_append_string (dpi, "false");
3172                       return;
3173                     case '1':
3174                       d_append_string (dpi, "true");
3175                       return;
3176                     default:
3177                       break;
3178                     }
3179                 }
3180               break;
3181
3182             default:
3183               break;
3184             }
3185         }
3186
3187       d_append_char (dpi, '(');
3188       d_print_comp (dpi, d_left (dc));
3189       d_append_char (dpi, ')');
3190       if (dc->type == D_COMP_LITERAL_NEG)
3191         d_append_char (dpi, '-');
3192       d_print_comp (dpi, d_right (dc));
3193       return;
3194
3195     default:
3196       d_print_error (dpi);
3197       return;
3198     }
3199 }
3200
3201 /* Print an identifier.  */
3202
3203 static void
3204 d_print_identifier (dpi, name, len)
3205      struct d_print_info *dpi;
3206      const char *name;
3207      int len;
3208 {
3209   if ((dpi->options & DMGL_JAVA) == 0)
3210     d_append_buffer (dpi, name, len);
3211   else
3212     {
3213       const char *p;
3214       const char *end;
3215
3216       /* For Java we try to handle encoded extended Unicode
3217          characters.  The C++ ABI doesn't mention Unicode encoding, so
3218          we don't it for C++.  Characters are encoded as
3219          __U<hex-char>+_.  */
3220       end = name + len;
3221       for (p = name; p < end; ++p)
3222         {
3223           if (end - p > 3
3224               && p[0] == '_'
3225               && p[1] == '_'
3226               && p[2] == 'U')
3227             {
3228               unsigned long c;
3229               const char *q;
3230
3231               c = 0;
3232               for (q = p + 3; q < end; ++q)
3233                 {
3234                   int dig;
3235
3236                   if (IS_DIGIT (*q))
3237                     dig = *q - '0';
3238                   else if (*q >= 'A' && *q <= 'F')
3239                     dig = *q - 'A' + 10;
3240                   else if (*q >= 'a' && *q <= 'f')
3241                     dig = *q - 'a' + 10;
3242                   else
3243                     break;
3244
3245                   c = c * 16 + dig;
3246                 }
3247               /* If the Unicode character is larger than 256, we don't
3248                  try to deal with it here.  FIXME.  */
3249               if (q < end && *q == '_' && c < 256)
3250                 {
3251                   d_append_char (dpi, c);
3252                   p = q;
3253                   continue;
3254                 }
3255             }
3256
3257           d_append_char (dpi, *p);
3258         }
3259     }
3260 }
3261
3262 /* Print a list of modifiers.  SUFFIX is 1 if we are printing
3263    qualifiers on this after printing a function.  */
3264
3265 static void
3266 d_print_mod_list (dpi, mods, suffix)
3267      struct d_print_info *dpi;
3268      struct d_print_mod *mods;
3269      int suffix;
3270 {
3271   struct d_print_template *hold_dpt;
3272
3273   if (mods == NULL || d_print_saw_error (dpi))
3274     return;
3275
3276   if (mods->printed
3277       || (! suffix
3278           && (mods->mod->type == D_COMP_RESTRICT_THIS
3279               || mods->mod->type == D_COMP_VOLATILE_THIS
3280               || mods->mod->type == D_COMP_CONST_THIS)))
3281     {
3282       d_print_mod_list (dpi, mods->next, suffix);
3283       return;
3284     }
3285
3286   mods->printed = 1;
3287
3288   hold_dpt = dpi->templates;
3289   dpi->templates = mods->templates;
3290
3291   if (mods->mod->type == D_COMP_FUNCTION_TYPE)
3292     {
3293       d_print_function_type (dpi, mods->mod, mods->next);
3294       dpi->templates = hold_dpt;
3295       return;
3296     }
3297   else if (mods->mod->type == D_COMP_ARRAY_TYPE)
3298     {
3299       d_print_array_type (dpi, mods->mod, mods->next);
3300       dpi->templates = hold_dpt;
3301       return;
3302     }
3303   else if (mods->mod->type == D_COMP_LOCAL_NAME)
3304     {
3305       struct d_print_mod *hold_modifiers;
3306       struct d_comp *dc;
3307
3308       /* When this is on the modifier stack, we have pulled any
3309          qualifiers off the right argument already.  Otherwise, we
3310          print it as usual, but don't let the left argument see any
3311          modifiers.  */
3312
3313       hold_modifiers = dpi->modifiers;
3314       dpi->modifiers = NULL;
3315       d_print_comp (dpi, d_left (mods->mod));
3316       dpi->modifiers = hold_modifiers;
3317
3318       d_append_string (dpi, (dpi->options & DMGL_JAVA) == 0 ? "::" : ".");
3319
3320       dc = d_right (mods->mod);
3321       while (dc->type == D_COMP_RESTRICT_THIS
3322              || dc->type == D_COMP_VOLATILE_THIS
3323              || dc->type == D_COMP_CONST_THIS)
3324         dc = d_left (dc);
3325
3326       d_print_comp (dpi, dc);
3327
3328       dpi->templates = hold_dpt;
3329       return;
3330     }
3331
3332   d_print_mod (dpi, mods->mod);
3333
3334   dpi->templates = hold_dpt;
3335
3336   d_print_mod_list (dpi, mods->next, suffix);
3337 }
3338
3339 /* Print a modifier.  */
3340
3341 static void
3342 d_print_mod (dpi, mod)
3343      struct d_print_info *dpi;
3344      const struct d_comp *mod;
3345 {
3346   switch (mod->type)
3347     {
3348     case D_COMP_RESTRICT:
3349     case D_COMP_RESTRICT_THIS:
3350       d_append_string (dpi, " restrict");
3351       return;
3352     case D_COMP_VOLATILE:
3353     case D_COMP_VOLATILE_THIS:
3354       d_append_string (dpi, " volatile");
3355       return;
3356     case D_COMP_CONST:
3357     case D_COMP_CONST_THIS:
3358       d_append_string (dpi, " const");
3359       return;
3360     case D_COMP_VENDOR_TYPE_QUAL:
3361       d_append_char (dpi, ' ');
3362       d_print_comp (dpi, d_right (mod));
3363       return;
3364     case D_COMP_POINTER:
3365       /* There is no pointer symbol in Java.  */
3366       if ((dpi->options & DMGL_JAVA) == 0)
3367         d_append_char (dpi, '*');
3368       return;
3369     case D_COMP_REFERENCE:
3370       d_append_char (dpi, '&');
3371       return;
3372     case D_COMP_COMPLEX:
3373       d_append_string (dpi, "complex ");
3374       return;
3375     case D_COMP_IMAGINARY:
3376       d_append_string (dpi, "imaginary ");
3377       return;
3378     case D_COMP_PTRMEM_TYPE:
3379       if (d_last_char (dpi) != '(')
3380         d_append_char (dpi, ' ');
3381       d_print_comp (dpi, d_left (mod));
3382       d_append_string (dpi, "::*");
3383       return;
3384     case D_COMP_TYPED_NAME:
3385       d_print_comp (dpi, d_left (mod));
3386       return;
3387     default:
3388       /* Otherwise, we have something that won't go back on the
3389          modifier stack, so we can just print it.  */
3390       d_print_comp (dpi, mod);
3391       return;
3392     }
3393 }
3394
3395 /* Print a function type, except for the return type.  */
3396
3397 static void
3398 d_print_function_type (dpi, dc, mods)
3399      struct d_print_info *dpi;
3400      const struct d_comp *dc;
3401      struct d_print_mod *mods;
3402 {
3403   int need_paren;
3404   int saw_mod;
3405   struct d_print_mod *p;
3406   struct d_print_mod *hold_modifiers;
3407
3408   need_paren = 0;
3409   saw_mod = 0;
3410   for (p = mods; p != NULL; p = p->next)
3411     {
3412       if (p->printed)
3413         break;
3414
3415       saw_mod = 1;
3416       switch (p->mod->type)
3417         {
3418         case D_COMP_RESTRICT:
3419         case D_COMP_VOLATILE:
3420         case D_COMP_CONST:
3421         case D_COMP_VENDOR_TYPE_QUAL:
3422         case D_COMP_POINTER:
3423         case D_COMP_REFERENCE:
3424         case D_COMP_COMPLEX:
3425         case D_COMP_IMAGINARY:
3426         case D_COMP_PTRMEM_TYPE:
3427           need_paren = 1;
3428           break;
3429         case D_COMP_RESTRICT_THIS:
3430         case D_COMP_VOLATILE_THIS:
3431         case D_COMP_CONST_THIS:
3432           break;
3433         default:
3434           break;
3435         }
3436       if (need_paren)
3437         break;
3438     }
3439
3440   if (d_left (dc) != NULL && ! saw_mod)
3441     need_paren = 1;
3442
3443   if (need_paren)
3444     {
3445       switch (d_last_char (dpi))
3446         {
3447         case ' ':
3448         case '(':
3449         case '*':
3450           break;
3451
3452         default:
3453           d_append_char (dpi, ' ');
3454           break;
3455         }
3456
3457       d_append_char (dpi, '(');
3458     }
3459
3460   hold_modifiers = dpi->modifiers;
3461   dpi->modifiers = NULL;
3462
3463   d_print_mod_list (dpi, mods, 0);
3464
3465   if (need_paren)
3466     d_append_char (dpi, ')');
3467
3468   d_append_char (dpi, '(');
3469
3470   if (d_right (dc) != NULL)
3471     d_print_comp (dpi, d_right (dc));
3472
3473   d_append_char (dpi, ')');
3474
3475   d_print_mod_list (dpi, mods, 1);
3476
3477   dpi->modifiers = hold_modifiers;
3478 }
3479
3480 /* Print an array type, except for the element type.  */
3481
3482 static void
3483 d_print_array_type (dpi, dc, mods)
3484      struct d_print_info *dpi;
3485      const struct d_comp *dc;
3486      struct d_print_mod *mods;
3487 {
3488   int need_space;
3489
3490   need_space = 1;
3491   if (mods != NULL)
3492     {
3493       int need_paren;
3494       struct d_print_mod *p;
3495
3496       need_paren = 0;
3497       for (p = mods; p != NULL; p = p->next)
3498         {
3499           if (p->printed)
3500             break;
3501
3502           if (p->mod->type == D_COMP_ARRAY_TYPE)
3503             {
3504               need_space = 0;
3505               break;
3506             }
3507           else
3508             {
3509               need_paren = 1;
3510               need_space = 1;
3511               break;
3512             }
3513         }
3514
3515       if (need_paren)
3516         d_append_string (dpi, " (");
3517
3518       d_print_mod_list (dpi, mods, 0);
3519
3520       if (need_paren)
3521         d_append_char (dpi, ')');
3522     }
3523
3524   if (need_space)
3525     d_append_char (dpi, ' ');
3526
3527   d_append_char (dpi, '[');
3528
3529   if (d_left (dc) != NULL)
3530     d_print_comp (dpi, d_left (dc));
3531
3532   d_append_char (dpi, ']');
3533 }
3534
3535 /* Print an operator in an expression.  */
3536
3537 static void
3538 d_print_expr_op (dpi, dc)
3539      struct d_print_info *dpi;
3540      const struct d_comp *dc;
3541 {
3542   if (dc->type == D_COMP_OPERATOR)
3543     d_append_string (dpi, dc->u.s_operator.op->name);
3544   else
3545     d_print_comp (dpi, dc);
3546 }
3547
3548 /* Print a cast.  */
3549
3550 static void
3551 d_print_cast (dpi, dc)
3552      struct d_print_info *dpi;
3553      const struct d_comp *dc;
3554 {
3555   if (d_left (dc)->type != D_COMP_TEMPLATE)
3556     d_print_comp (dpi, d_left (dc));
3557   else
3558     {
3559       struct d_print_mod *hold_dpm;
3560       struct d_print_template dpt;
3561
3562       /* It appears that for a templated cast operator, we need to put
3563          the template parameters in scope for the operator name, but
3564          not for the parameters.  The effect is that we need to handle
3565          the template printing here.  */
3566
3567       hold_dpm = dpi->modifiers;
3568       dpi->modifiers = NULL;
3569
3570       dpt.next = dpi->templates;
3571       dpi->templates = &dpt;
3572       dpt.template = d_left (dc);
3573
3574       d_print_comp (dpi, d_left (d_left (dc)));
3575
3576       dpi->templates = dpt.next;
3577
3578       if (d_last_char (dpi) == '<')
3579         d_append_char (dpi, ' ');
3580       d_append_char (dpi, '<');
3581       d_print_comp (dpi, d_right (d_left (dc)));
3582       /* Avoid generating two consecutive '>' characters, to avoid
3583          the C++ syntactic ambiguity.  */
3584       if (d_last_char (dpi) == '>')
3585         d_append_char (dpi, ' ');
3586       d_append_char (dpi, '>');
3587
3588       dpi->modifiers = hold_dpm;
3589     }
3590 }
3591
3592 /* Initialize the information structure we use to pass around
3593    information.  */
3594
3595 static int
3596 d_init_info (mangled, options, len, di)
3597      const char *mangled;
3598      int options;
3599      size_t len;
3600      struct d_info *di;
3601 {
3602   di->s = mangled;
3603   di->options = options;
3604
3605   di->n = mangled;
3606
3607   /* We can not need more components than twice the number of chars in
3608      the mangled string.  Most components correspond directly to
3609      chars, but the ARGLIST types are exceptions.  */
3610   di->num_comps = 2 * len;
3611   di->comps = (struct d_comp *) malloc (di->num_comps
3612                                         * sizeof (struct d_comp));
3613   di->next_comp = 0;
3614
3615   /* Similarly, we can not need more substitutions than there are
3616      chars in the mangled string.  */
3617   di->num_subs = len;
3618   di->subs = (struct d_comp **) malloc (di->num_subs
3619                                         * sizeof (struct d_comp *));
3620   di->next_sub = 0;
3621
3622   di->last_name = NULL;
3623
3624   if (di->comps == NULL || di->subs == NULL)
3625     {
3626       if (di->comps != NULL)
3627         free (di->comps);
3628       if (di->subs != NULL)
3629         free (di->subs);
3630       return 0;
3631     }
3632
3633   return 1;
3634 }
3635
3636 /* Entry point for the demangler.  If MANGLED is a g++ v3 ABI mangled
3637    name, return a buffer allocated with malloc holding the demangled
3638    name.  OPTIONS is the usual libiberty demangler options.  On
3639    success, this sets *PALC to the allocated size of the returned
3640    buffer.  On failure, this sets *PALC to 0 for a bad name, or 1 for
3641    a memory allocation failure.  On failure, this returns NULL.  */
3642
3643 static char *
3644 d_demangle (mangled, options, palc)
3645      const char* mangled;
3646      int options;
3647      size_t *palc;
3648 {
3649   size_t len;
3650   int type;
3651   struct d_info di;
3652   struct d_comp *dc;
3653   char *ret;
3654
3655   *palc = 0;
3656
3657   len = strlen (mangled);
3658
3659   if (mangled[0] == '_' && mangled[1] == 'Z')
3660     type = 0;
3661   else if (strncmp (mangled, "_GLOBAL_", 8) == 0
3662            && (mangled[8] == '.' || mangled[8] == '_' || mangled[8] == '$')
3663            && (mangled[9] == 'D' || mangled[9] == 'I')
3664            && mangled[10] == '_')
3665     {
3666       char *r;
3667
3668       r = malloc (40 + len - 11);
3669       if (r == NULL)
3670         *palc = 1;
3671       else
3672         {
3673           if (mangled[9] == 'I')
3674             strcpy (r, "global constructors keyed to ");
3675           else
3676             strcpy (r, "global destructors keyed to ");
3677           strcat (r, mangled + 11);
3678         }
3679       return r;
3680     }
3681   else
3682     {
3683       if ((options & DMGL_TYPES) == 0)
3684         return NULL;
3685       type = 1;
3686     }
3687
3688   if (! d_init_info (mangled, options, len, &di))
3689     {
3690       *palc = 1;
3691       return NULL;
3692     }
3693
3694   if (! type)
3695     dc = d_mangled_name (&di, 1);
3696   else
3697     dc = d_type (&di);
3698
3699   /* If DMGL_PARAMS is set, then if we didn't consume the entire
3700      mangled string, then we didn't successfully demangle it.  If
3701      DMGL_PARAMS is not set, we didn't look at the trailing
3702      parameters.  */
3703   if (((options & DMGL_PARAMS) != 0) && d_peek_char (&di) != '\0')
3704     dc = NULL;
3705
3706 #ifdef CP_DEMANGLE_DEBUG
3707   if (dc == NULL)
3708     printf ("failed demangling\n");
3709   else
3710     d_dump (dc, 0);
3711 #endif
3712
3713   free (di.subs);
3714   di.subs = NULL;
3715
3716   ret = NULL;
3717   if (dc != NULL)
3718     ret = d_print (options, dc, palc);
3719
3720   free (di.comps);
3721
3722   return ret;
3723 }
3724
3725 #if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3)
3726
3727 extern char *__cxa_demangle PARAMS ((const char *, char *, size_t *, int *));
3728
3729 /* ia64 ABI-mandated entry point in the C++ runtime library for
3730    performing demangling.  MANGLED_NAME is a NUL-terminated character
3731    string containing the name to be demangled.
3732
3733    OUTPUT_BUFFER is a region of memory, allocated with malloc, of
3734    *LENGTH bytes, into which the demangled name is stored.  If
3735    OUTPUT_BUFFER is not long enough, it is expanded using realloc.
3736    OUTPUT_BUFFER may instead be NULL; in that case, the demangled name
3737    is placed in a region of memory allocated with malloc.
3738
3739    If LENGTH is non-NULL, the length of the buffer conaining the
3740    demangled name, is placed in *LENGTH.
3741
3742    The return value is a pointer to the start of the NUL-terminated
3743    demangled name, or NULL if the demangling fails.  The caller is
3744    responsible for deallocating this memory using free.
3745
3746    *STATUS is set to one of the following values:
3747       0: The demangling operation succeeded.
3748      -1: A memory allocation failure occurred.
3749      -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
3750      -3: One of the arguments is invalid.
3751
3752    The demangling is performed using the C++ ABI mangling rules, with
3753    GNU extensions.  */
3754
3755 char *
3756 __cxa_demangle (mangled_name, output_buffer, length, status)
3757      const char *mangled_name;
3758      char *output_buffer;
3759      size_t *length;
3760      int *status;
3761 {
3762   char *demangled;
3763   size_t alc;
3764
3765   if (status == NULL)
3766     return NULL;
3767
3768   if (mangled_name == NULL)
3769     {
3770       *status = -3;
3771       return NULL;
3772     }
3773
3774   if (output_buffer != NULL && length == NULL)
3775     {
3776       *status = -3;
3777       return NULL;
3778     }
3779
3780   demangled = d_demangle (mangled_name, DMGL_TYPES, &alc);
3781
3782   if (demangled == NULL)
3783     {
3784       if (alc == 1)
3785         *status = -1;
3786       else
3787         *status = -2;
3788       return NULL;
3789     }
3790
3791   if (output_buffer == NULL)
3792     {
3793       if (length != NULL)
3794         *length = alc;
3795     }
3796   else
3797     {
3798       if (strlen (demangled) < *length)
3799         {
3800           strcpy (output_buffer, demangled);
3801           free (demangled);
3802           demangled = output_buffer;
3803         }
3804       else
3805         {
3806           free (output_buffer);
3807           *length = alc;
3808         }
3809     }
3810
3811   *status = 0;
3812
3813   return demangled;
3814 }
3815
3816 #else /* ! (IN_LIBGCC2 || IN_GLIBCPP_V3) */
3817
3818 /* Entry point for libiberty demangler.  If MANGLED is a g++ v3 ABI
3819    mangled name, return a buffer allocated with malloc holding the
3820    demangled name.  Otherwise, return NULL.  */
3821
3822 char *
3823 cplus_demangle_v3 (mangled, options)
3824      const char* mangled;
3825      int options;
3826 {
3827   size_t alc;
3828
3829   return d_demangle (mangled, options, &alc);
3830 }
3831
3832 /* Demangle a Java symbol.  Java uses a subset of the V3 ABI C++ mangling 
3833    conventions, but the output formatting is a little different.
3834    This instructs the C++ demangler not to emit pointer characters ("*"), and 
3835    to use Java's namespace separator symbol ("." instead of "::").  It then 
3836    does an additional pass over the demangled output to replace instances 
3837    of JArray<TYPE> with TYPE[].  */
3838
3839 char *
3840 java_demangle_v3 (mangled)
3841      const char* mangled;
3842 {
3843   size_t alc;
3844   char *demangled;
3845   int nesting;
3846   char *from;
3847   char *to;
3848
3849   demangled = d_demangle (mangled, DMGL_JAVA | DMGL_PARAMS, &alc);
3850
3851   if (demangled == NULL)
3852     return NULL;
3853
3854   nesting = 0;
3855   from = demangled;
3856   to = from;
3857   while (*from != '\0')
3858     {
3859       if (strncmp (from, "JArray<", 7) == 0)
3860         {
3861           from += 7;
3862           ++nesting;
3863         }
3864       else if (nesting > 0 && *from == '>')
3865         {
3866           while (to > demangled && to[-1] == ' ')
3867             --to;
3868           *to++ = '[';
3869           *to++ = ']';
3870           --nesting;
3871           ++from;
3872         }
3873       else
3874         *to++ = *from++;
3875     }
3876
3877   *to = '\0';
3878
3879   return demangled;
3880 }
3881
3882 #endif /* IN_LIBGCC2 || IN_GLIBCPP_V3 */
3883
3884 #ifndef IN_GLIBCPP_V3
3885
3886 /* Demangle a string in order to find out whether it is a constructor
3887    or destructor.  Return non-zero on success.  Set *CTOR_KIND and
3888    *DTOR_KIND appropriately.  */
3889
3890 static int
3891 is_ctor_or_dtor (mangled, ctor_kind, dtor_kind)
3892      const char *mangled;
3893      enum gnu_v3_ctor_kinds *ctor_kind;
3894      enum gnu_v3_dtor_kinds *dtor_kind;
3895 {
3896   struct d_info di;
3897   struct d_comp *dc;
3898   int ret;
3899
3900   *ctor_kind = (enum gnu_v3_ctor_kinds) 0;
3901   *dtor_kind = (enum gnu_v3_dtor_kinds) 0;
3902
3903   if (! d_init_info (mangled, DMGL_GNU_V3, strlen (mangled), &di))
3904     return 0;
3905
3906   dc = d_mangled_name (&di, 1);
3907
3908   /* Note that because we did not pass DMGL_PARAMS, we don't expect to
3909      demangle the entire string.  */
3910
3911   ret = 0;
3912   while (dc != NULL)
3913     {
3914       switch (dc->type)
3915         {
3916         default:
3917           dc = NULL;
3918           break;
3919         case D_COMP_TYPED_NAME:
3920         case D_COMP_TEMPLATE:
3921         case D_COMP_RESTRICT_THIS:
3922         case D_COMP_VOLATILE_THIS:
3923         case D_COMP_CONST_THIS:
3924           dc = d_left (dc);
3925           break;
3926         case D_COMP_QUAL_NAME:
3927         case D_COMP_LOCAL_NAME:
3928           dc = d_right (dc);
3929           break;
3930         case D_COMP_CTOR:
3931           *ctor_kind = dc->u.s_ctor.kind;
3932           ret = 1;
3933           dc = NULL;
3934           break;
3935         case D_COMP_DTOR:
3936           *dtor_kind = dc->u.s_dtor.kind;
3937           ret = 1;
3938           dc = NULL;
3939           break;
3940         }
3941     }
3942
3943   free (di.subs);
3944   free (di.comps);
3945
3946   return ret;
3947 }
3948
3949 /* Return whether NAME is the mangled form of a g++ V3 ABI constructor
3950    name.  A non-zero return indicates the type of constructor.  */
3951
3952 enum gnu_v3_ctor_kinds
3953 is_gnu_v3_mangled_ctor (name)
3954      const char *name;
3955 {
3956   enum gnu_v3_ctor_kinds ctor_kind;
3957   enum gnu_v3_dtor_kinds dtor_kind;
3958
3959   if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
3960     return (enum gnu_v3_ctor_kinds) 0;
3961   return ctor_kind;
3962 }
3963
3964
3965 /* Return whether NAME is the mangled form of a g++ V3 ABI destructor
3966    name.  A non-zero return indicates the type of destructor.  */
3967
3968 enum gnu_v3_dtor_kinds
3969 is_gnu_v3_mangled_dtor (name)
3970      const char *name;
3971 {
3972   enum gnu_v3_ctor_kinds ctor_kind;
3973   enum gnu_v3_dtor_kinds dtor_kind;
3974
3975   if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
3976     return (enum gnu_v3_dtor_kinds) 0;
3977   return dtor_kind;
3978 }
3979
3980 #endif /* IN_GLIBCPP_V3 */
3981
3982 #ifdef STANDALONE_DEMANGLER
3983
3984 #include "getopt.h"
3985 #include "dyn-string.h"
3986
3987 static void print_usage PARAMS ((FILE* fp, int exit_value));
3988
3989 #define IS_ALPHA(CHAR)                                                  \
3990   (((CHAR) >= 'a' && (CHAR) <= 'z')                                     \
3991    || ((CHAR) >= 'A' && (CHAR) <= 'Z'))
3992
3993 /* Non-zero if CHAR is a character than can occur in a mangled name.  */
3994 #define is_mangled_char(CHAR)                                           \
3995   (IS_ALPHA (CHAR) || IS_DIGIT (CHAR)                                   \
3996    || (CHAR) == '_' || (CHAR) == '.' || (CHAR) == '$')
3997
3998 /* The name of this program, as invoked.  */
3999 const char* program_name;
4000
4001 /* Prints usage summary to FP and then exits with EXIT_VALUE.  */
4002
4003 static void
4004 print_usage (fp, exit_value)
4005      FILE* fp;
4006      int exit_value;
4007 {
4008   fprintf (fp, "Usage: %s [options] [names ...]\n", program_name);
4009   fprintf (fp, "Options:\n");
4010   fprintf (fp, "  -h,--help       Display this message.\n");
4011   fprintf (fp, "  -p,--no-params  Don't display function parameters\n");
4012   fprintf (fp, "  -v,--verbose    Produce verbose demanglings.\n");
4013   fprintf (fp, "If names are provided, they are demangled.  Otherwise filters standard input.\n");
4014
4015   exit (exit_value);
4016 }
4017
4018 /* Option specification for getopt_long.  */
4019 static const struct option long_options[] = 
4020 {
4021   { "help",      no_argument, NULL, 'h' },
4022   { "no-params", no_argument, NULL, 'p' },
4023   { "verbose",   no_argument, NULL, 'v' },
4024   { NULL,        no_argument, NULL, 0   },
4025 };
4026
4027 /* Main entry for a demangling filter executable.  It will demangle
4028    its command line arguments, if any.  If none are provided, it will
4029    filter stdin to stdout, replacing any recognized mangled C++ names
4030    with their demangled equivalents.  */
4031
4032 int
4033 main (argc, argv)
4034      int argc;
4035      char *argv[];
4036 {
4037   int i;
4038   int opt_char;
4039   int options = DMGL_PARAMS | DMGL_ANSI | DMGL_TYPES;
4040
4041   /* Use the program name of this program, as invoked.  */
4042   program_name = argv[0];
4043
4044   /* Parse options.  */
4045   do 
4046     {
4047       opt_char = getopt_long (argc, argv, "hpv", long_options, NULL);
4048       switch (opt_char)
4049         {
4050         case '?':  /* Unrecognized option.  */
4051           print_usage (stderr, 1);
4052           break;
4053
4054         case 'h':
4055           print_usage (stdout, 0);
4056           break;
4057
4058         case 'p':
4059           options &= ~ DMGL_PARAMS;
4060           break;
4061
4062         case 'v':
4063           options |= DMGL_VERBOSE;
4064           break;
4065         }
4066     }
4067   while (opt_char != -1);
4068
4069   if (optind == argc) 
4070     /* No command line arguments were provided.  Filter stdin.  */
4071     {
4072       dyn_string_t mangled = dyn_string_new (3);
4073       char *s;
4074
4075       /* Read all of input.  */
4076       while (!feof (stdin))
4077         {
4078           char c;
4079
4080           /* Pile characters into mangled until we hit one that can't
4081              occur in a mangled name.  */
4082           c = getchar ();
4083           while (!feof (stdin) && is_mangled_char (c))
4084             {
4085               dyn_string_append_char (mangled, c);
4086               if (feof (stdin))
4087                 break;
4088               c = getchar ();
4089             }
4090
4091           if (dyn_string_length (mangled) > 0)
4092             {
4093               s = cplus_demangle_v3 (dyn_string_buf (mangled), options);
4094
4095               if (s != NULL)
4096                 {
4097                   fputs (s, stdout);
4098                   free (s);
4099                 }
4100               else
4101                 {
4102                   /* It might not have been a mangled name.  Print the
4103                      original text.  */
4104                   fputs (dyn_string_buf (mangled), stdout);
4105                 }
4106
4107               dyn_string_clear (mangled);
4108             }
4109
4110           /* If we haven't hit EOF yet, we've read one character that
4111              can't occur in a mangled name, so print it out.  */
4112           if (!feof (stdin))
4113             putchar (c);
4114         }
4115
4116       dyn_string_delete (mangled);
4117     }
4118   else
4119     /* Demangle command line arguments.  */
4120     {
4121       /* Loop over command line arguments.  */
4122       for (i = optind; i < argc; ++i)
4123         {
4124           char *s;
4125
4126           /* Attempt to demangle.  */
4127           s = cplus_demangle_v3 (argv[i], options);
4128
4129           /* If it worked, print the demangled name.  */
4130           if (s != NULL)
4131             {
4132               printf ("%s\n", s);
4133               free (s);
4134             }
4135           else
4136             fprintf (stderr, "Failed: %s\n", argv[i]);
4137         }
4138     }
4139
4140   return 0;
4141 }
4142
4143 #endif /* STANDALONE_DEMANGLER */