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