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