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