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