*** empty log message ***
[deliverable/binutils-gdb.git] / libiberty / cp-demangle.c
CommitLineData
d00edca5 1/* Demangler for g++ V3 ABI.
04aed652 2 Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
dddc49b7 3 Free Software Foundation, Inc.
d00edca5 4 Written by Ian Lance Taylor <ian@wasabisystems.com>.
eb383413 5
9ad1aa29 6 This file is part of the libiberty library, which is part of GCC.
74bcd529 7
9ad1aa29 8 This file is free software; you can redistribute it and/or modify
eb383413
L
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
35efcd67
DD
13 In addition to the permissions in the GNU General Public License, the
14 Free Software Foundation gives you unlimited permission to link the
15 compiled version of this file into combinations with other programs,
16 and to distribute those combinations without any restriction coming
17 from the use of this file. (The General Public License restrictions
18 do apply in other respects; for example, they cover modification of
19 the file, and distribution when not linked into a combined
20 executable.)
21
eb383413
L
22 This program is distributed in the hope that it will be useful,
23 but WITHOUT ANY WARRANTY; without even the implied warranty of
24 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25 GNU General Public License for more details.
26
27 You should have received a copy of the GNU General Public License
28 along with this program; if not, write to the Free Software
979c05d3 29 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
eb383413
L
30*/
31
858b45cf
DD
32/* This code implements a demangler for the g++ V3 ABI. The ABI is
33 described on this web page:
34 http://www.codesourcery.com/cxx-abi/abi.html#mangling
35
36 This code was written while looking at the demangler written by
37 Alex Samuel <samuel@codesourcery.com>.
38
39 This code first pulls the mangled name apart into a list of
40 components, and then walks the list generating the demangled
41 name.
42
43 This file will normally define the following functions, q.v.:
44 char *cplus_demangle_v3(const char *mangled, int options)
45 char *java_demangle_v3(const char *mangled)
208c1674
DD
46 int cplus_demangle_v3_callback(const char *mangled, int options,
47 demangle_callbackref callback)
48 int java_demangle_v3_callback(const char *mangled,
49 demangle_callbackref callback)
858b45cf
DD
50 enum gnu_v3_ctor_kinds is_gnu_v3_mangled_ctor (const char *name)
51 enum gnu_v3_dtor_kinds is_gnu_v3_mangled_dtor (const char *name)
52
59727473
DD
53 Also, the interface to the component list is public, and defined in
54 demangle.h. The interface consists of these types, which are
55 defined in demangle.h:
56 enum demangle_component_type
57 struct demangle_component
208c1674 58 demangle_callbackref
59727473
DD
59 and these functions defined in this file:
60 cplus_demangle_fill_name
61 cplus_demangle_fill_extended_operator
62 cplus_demangle_fill_ctor
63 cplus_demangle_fill_dtor
64 cplus_demangle_print
208c1674 65 cplus_demangle_print_callback
59727473
DD
66 and other functions defined in the file cp-demint.c.
67
68 This file also defines some other functions and variables which are
69 only to be used by the file cp-demint.c.
70
858b45cf
DD
71 Preprocessor macros you can define while compiling this file:
72
73 IN_LIBGCC2
208c1674 74 If defined, this file defines the following functions, q.v.:
858b45cf
DD
75 char *__cxa_demangle (const char *mangled, char *buf, size_t *len,
76 int *status)
208c1674
DD
77 int __gcclibcxx_demangle_callback (const char *,
78 void (*)
79 (const char *, size_t, void *),
80 void *)
81 instead of cplus_demangle_v3[_callback]() and
82 java_demangle_v3[_callback]().
858b45cf
DD
83
84 IN_GLIBCPP_V3
208c1674
DD
85 If defined, this file defines only __cxa_demangle() and
86 __gcclibcxx_demangle_callback(), and no other publically visible
87 functions or variables.
858b45cf
DD
88
89 STANDALONE_DEMANGLER
90 If defined, this file defines a main() function which demangles
91 any arguments, or, if none, demangles stdin.
92
93 CP_DEMANGLE_DEBUG
94 If defined, turns on debugging mode, which prints information on
95 stdout about the mangled string. This is not generally useful.
96*/
97
208c1674
DD
98#if defined (_AIX) && !defined (__GNUC__)
99 #pragma alloca
100#endif
101
eb383413
L
102#ifdef HAVE_CONFIG_H
103#include "config.h"
104#endif
105
d00edca5 106#include <stdio.h>
b1233257 107
eb383413
L
108#ifdef HAVE_STDLIB_H
109#include <stdlib.h>
110#endif
eb383413
L
111#ifdef HAVE_STRING_H
112#include <string.h>
113#endif
114
208c1674
DD
115#ifdef HAVE_ALLOCA_H
116# include <alloca.h>
117#else
118# ifndef alloca
119# ifdef __GNUC__
120# define alloca __builtin_alloca
121# else
122extern char *alloca ();
123# endif /* __GNUC__ */
124# endif /* alloca */
125#endif /* HAVE_ALLOCA_H */
126
eb383413
L
127#include "ansidecl.h"
128#include "libiberty.h"
eb383413 129#include "demangle.h"
59727473
DD
130#include "cp-demangle.h"
131
132/* If IN_GLIBCPP_V3 is defined, some functions are made static. We
133 also rename them via #define to avoid compiler errors when the
134 static definition conflicts with the extern declaration in a header
135 file. */
136#ifdef IN_GLIBCPP_V3
137
138#define CP_STATIC_IF_GLIBCPP_V3 static
139
140#define cplus_demangle_fill_name d_fill_name
9334f9c6 141static int d_fill_name (struct demangle_component *, const char *, int);
59727473
DD
142
143#define cplus_demangle_fill_extended_operator d_fill_extended_operator
144static int
9334f9c6
DD
145d_fill_extended_operator (struct demangle_component *, int,
146 struct demangle_component *);
59727473
DD
147
148#define cplus_demangle_fill_ctor d_fill_ctor
149static int
9334f9c6
DD
150d_fill_ctor (struct demangle_component *, enum gnu_v3_ctor_kinds,
151 struct demangle_component *);
59727473
DD
152
153#define cplus_demangle_fill_dtor d_fill_dtor
154static int
9334f9c6
DD
155d_fill_dtor (struct demangle_component *, enum gnu_v3_dtor_kinds,
156 struct demangle_component *);
59727473
DD
157
158#define cplus_demangle_mangled_name d_mangled_name
9334f9c6 159static struct demangle_component *d_mangled_name (struct d_info *, int);
59727473
DD
160
161#define cplus_demangle_type d_type
9334f9c6 162static struct demangle_component *d_type (struct d_info *);
59727473
DD
163
164#define cplus_demangle_print d_print
9334f9c6 165static char *d_print (int, const struct demangle_component *, int, size_t *);
59727473 166
208c1674
DD
167#define cplus_demangle_print_callback d_print_callback
168static int d_print_callback (int, const struct demangle_component *,
169 demangle_callbackref, void *);
170
59727473 171#define cplus_demangle_init_info d_init_info
9334f9c6 172static void d_init_info (const char *, int, size_t, struct d_info *);
59727473
DD
173
174#else /* ! defined(IN_GLIBCPP_V3) */
175#define CP_STATIC_IF_GLIBCPP_V3
176#endif /* ! defined(IN_GLIBCPP_V3) */
eb383413 177
b6fb00c0
DD
178/* See if the compiler supports dynamic arrays. */
179
180#ifdef __GNUC__
181#define CP_DYNAMIC_ARRAYS
182#else
183#ifdef __STDC__
184#ifdef __STDC_VERSION__
185#if __STDC_VERSION__ >= 199901L
186#define CP_DYNAMIC_ARRAYS
187#endif /* __STDC__VERSION >= 199901L */
188#endif /* defined (__STDC_VERSION__) */
189#endif /* defined (__STDC__) */
190#endif /* ! defined (__GNUC__) */
191
858b45cf
DD
192/* We avoid pulling in the ctype tables, to prevent pulling in
193 additional unresolved symbols when this code is used in a library.
194 FIXME: Is this really a valid reason? This comes from the original
195 V3 demangler code.
d00edca5 196
858b45cf 197 As of this writing this file has the following undefined references
208c1674
DD
198 when compiled with -DIN_GLIBCPP_V3: realloc, free, memcpy, strcpy,
199 strcat, strlen. */
d00edca5 200
d00edca5 201#define IS_DIGIT(c) ((c) >= '0' && (c) <= '9')
858b45cf
DD
202#define IS_UPPER(c) ((c) >= 'A' && (c) <= 'Z')
203#define IS_LOWER(c) ((c) >= 'a' && (c) <= 'z')
03d5f569 204
74bcd529
DD
205/* The prefix prepended by GCC to an identifier represnting the
206 anonymous namespace. */
207#define ANONYMOUS_NAMESPACE_PREFIX "_GLOBAL_"
d00edca5
DD
208#define ANONYMOUS_NAMESPACE_PREFIX_LEN \
209 (sizeof (ANONYMOUS_NAMESPACE_PREFIX) - 1)
74bcd529 210
97ceaf5b
DD
211/* Information we keep for the standard substitutions. */
212
213struct d_standard_sub_info
214{
215 /* The code for this substitution. */
216 char code;
217 /* The simple string it expands to. */
218 const char *simple_expansion;
b6fb00c0
DD
219 /* The length of the simple expansion. */
220 int simple_len;
97ceaf5b
DD
221 /* The results of a full, verbose, expansion. This is used when
222 qualifying a constructor/destructor, or when in verbose mode. */
223 const char *full_expansion;
b6fb00c0
DD
224 /* The length of the full expansion. */
225 int full_len;
97ceaf5b
DD
226 /* What to set the last_name field of d_info to; NULL if we should
227 not set it. This is only relevant when qualifying a
228 constructor/destructor. */
229 const char *set_last_name;
b6fb00c0
DD
230 /* The length of set_last_name. */
231 int set_last_name_len;
97ceaf5b
DD
232};
233
59727473 234/* Accessors for subtrees of struct demangle_component. */
eb383413 235
d00edca5
DD
236#define d_left(dc) ((dc)->u.s_binary.left)
237#define d_right(dc) ((dc)->u.s_binary.right)
238
d00edca5 239/* A list of templates. This is used while printing. */
eb383413 240
d00edca5
DD
241struct d_print_template
242{
243 /* Next template on the list. */
244 struct d_print_template *next;
245 /* This template. */
abf6a75b 246 const struct demangle_component *template_decl;
d00edca5 247};
eb383413 248
d00edca5 249/* A list of type modifiers. This is used while printing. */
eb383413 250
d00edca5
DD
251struct d_print_mod
252{
253 /* Next modifier on the list. These are in the reverse of the order
254 in which they appeared in the mangled string. */
255 struct d_print_mod *next;
256 /* The modifier. */
59727473 257 const struct demangle_component *mod;
d00edca5
DD
258 /* Whether this modifier was printed. */
259 int printed;
331c3da2
DD
260 /* The list of templates which applies to this modifier. */
261 struct d_print_template *templates;
d00edca5 262};
eb383413 263
208c1674 264/* We use these structures to hold information during printing. */
d00edca5 265
208c1674 266struct d_growable_string
d00edca5 267{
d00edca5
DD
268 /* Buffer holding the result. */
269 char *buf;
270 /* Current length of data in buffer. */
271 size_t len;
272 /* Allocated size of buffer. */
273 size_t alc;
208c1674
DD
274 /* Set to 1 if we had a memory allocation failure. */
275 int allocation_failure;
276};
277
278enum { D_PRINT_BUFFER_LENGTH = 256 };
279struct d_print_info
280{
208c1674
DD
281 /* Fixed-length allocated buffer for demangled data, flushed to the
282 callback with a NUL termination once full. */
283 char buf[D_PRINT_BUFFER_LENGTH];
284 /* Current length of data in buffer. */
285 size_t len;
286 /* The last character printed, saved individually so that it survives
287 any buffer flush. */
288 char last_char;
289 /* Callback function to handle demangled buffer flush. */
290 demangle_callbackref callback;
291 /* Opaque callback argument. */
292 void *opaque;
d00edca5
DD
293 /* The current list of templates, if any. */
294 struct d_print_template *templates;
295 /* The current list of modifiers (e.g., pointer, reference, etc.),
296 if any. */
297 struct d_print_mod *modifiers;
208c1674
DD
298 /* Set to 1 if we saw a demangling error. */
299 int demangle_failure;
1c08f2c8
DD
300 /* The current index into any template argument packs we are using
301 for printing. */
302 int pack_index;
3baae9d6
JJ
303 /* Number of d_print_flush calls so far. */
304 unsigned long int flush_count;
d00edca5 305};
e61231f1 306
eb383413 307#ifdef CP_DEMANGLE_DEBUG
9334f9c6 308static void d_dump (struct demangle_component *, int);
eb383413 309#endif
59727473
DD
310
311static struct demangle_component *
9334f9c6 312d_make_empty (struct d_info *);
59727473
DD
313
314static struct demangle_component *
9334f9c6
DD
315d_make_comp (struct d_info *, enum demangle_component_type,
316 struct demangle_component *,
317 struct demangle_component *);
59727473
DD
318
319static struct demangle_component *
9334f9c6 320d_make_name (struct d_info *, const char *, int);
59727473 321
a0692e36
L
322static struct demangle_component *
323d_make_demangle_mangled_name (struct d_info *, const char *);
324
59727473 325static struct demangle_component *
9334f9c6
DD
326d_make_builtin_type (struct d_info *,
327 const struct demangle_builtin_type_info *);
59727473
DD
328
329static struct demangle_component *
9334f9c6
DD
330d_make_operator (struct d_info *,
331 const struct demangle_operator_info *);
59727473
DD
332
333static struct demangle_component *
9334f9c6
DD
334d_make_extended_operator (struct d_info *, int,
335 struct demangle_component *);
59727473
DD
336
337static struct demangle_component *
9334f9c6
DD
338d_make_ctor (struct d_info *, enum gnu_v3_ctor_kinds,
339 struct demangle_component *);
59727473
DD
340
341static struct demangle_component *
9334f9c6
DD
342d_make_dtor (struct d_info *, enum gnu_v3_dtor_kinds,
343 struct demangle_component *);
59727473
DD
344
345static struct demangle_component *
9334f9c6 346d_make_template_param (struct d_info *, long);
59727473
DD
347
348static struct demangle_component *
9334f9c6 349d_make_sub (struct d_info *, const char *, int);
59727473
DD
350
351static int
9334f9c6 352has_return_type (struct demangle_component *);
59727473
DD
353
354static int
9334f9c6 355is_ctor_dtor_or_conversion (struct demangle_component *);
59727473 356
9334f9c6 357static struct demangle_component *d_encoding (struct d_info *, int);
59727473 358
9334f9c6 359static struct demangle_component *d_name (struct d_info *);
59727473 360
9334f9c6 361static struct demangle_component *d_nested_name (struct d_info *);
59727473 362
9334f9c6 363static struct demangle_component *d_prefix (struct d_info *);
59727473 364
9334f9c6 365static struct demangle_component *d_unqualified_name (struct d_info *);
59727473 366
9334f9c6 367static struct demangle_component *d_source_name (struct d_info *);
59727473 368
9334f9c6 369static long d_number (struct d_info *);
59727473 370
9334f9c6 371static struct demangle_component *d_identifier (struct d_info *, int);
59727473 372
9334f9c6 373static struct demangle_component *d_operator_name (struct d_info *);
59727473 374
9334f9c6 375static struct demangle_component *d_special_name (struct d_info *);
59727473 376
9334f9c6 377static int d_call_offset (struct d_info *, int);
59727473 378
9334f9c6 379static struct demangle_component *d_ctor_dtor_name (struct d_info *);
59727473
DD
380
381static struct demangle_component **
9334f9c6 382d_cv_qualifiers (struct d_info *, struct demangle_component **, int);
59727473
DD
383
384static struct demangle_component *
9334f9c6 385d_function_type (struct d_info *);
59727473
DD
386
387static struct demangle_component *
9334f9c6 388d_bare_function_type (struct d_info *, int);
59727473
DD
389
390static struct demangle_component *
9334f9c6 391d_class_enum_type (struct d_info *);
59727473 392
9334f9c6 393static struct demangle_component *d_array_type (struct d_info *);
59727473 394
cbc43128
DD
395static struct demangle_component *d_vector_type (struct d_info *);
396
59727473 397static struct demangle_component *
9334f9c6 398d_pointer_to_member_type (struct d_info *);
59727473
DD
399
400static struct demangle_component *
9334f9c6 401d_template_param (struct d_info *);
59727473 402
9334f9c6 403static struct demangle_component *d_template_args (struct d_info *);
59727473
DD
404
405static struct demangle_component *
9334f9c6 406d_template_arg (struct d_info *);
59727473 407
9334f9c6 408static struct demangle_component *d_expression (struct d_info *);
59727473 409
9334f9c6 410static struct demangle_component *d_expr_primary (struct d_info *);
59727473 411
9334f9c6 412static struct demangle_component *d_local_name (struct d_info *);
59727473 413
9334f9c6 414static int d_discriminator (struct d_info *);
59727473 415
664aa91f
DD
416static struct demangle_component *d_lambda (struct d_info *);
417
418static struct demangle_component *d_unnamed_type (struct d_info *);
419
7955ede5
DD
420static struct demangle_component *
421d_clone_suffix (struct d_info *, struct demangle_component *);
422
59727473 423static int
9334f9c6 424d_add_substitution (struct d_info *, struct demangle_component *);
59727473 425
9334f9c6 426static struct demangle_component *d_substitution (struct d_info *, int);
59727473 427
208c1674 428static void d_growable_string_init (struct d_growable_string *, size_t);
59727473 429
208c1674
DD
430static inline void
431d_growable_string_resize (struct d_growable_string *, size_t);
59727473 432
208c1674
DD
433static inline void
434d_growable_string_append_buffer (struct d_growable_string *,
435 const char *, size_t);
59727473 436static void
208c1674
DD
437d_growable_string_callback_adapter (const char *, size_t, void *);
438
439static void
ddee5e46 440d_print_init (struct d_print_info *, demangle_callbackref, void *);
208c1674
DD
441
442static inline void d_print_error (struct d_print_info *);
443
444static inline int d_print_saw_error (struct d_print_info *);
445
446static inline void d_print_flush (struct d_print_info *);
447
448static inline void d_append_char (struct d_print_info *, char);
59727473 449
208c1674
DD
450static inline void d_append_buffer (struct d_print_info *,
451 const char *, size_t);
452
453static inline void d_append_string (struct d_print_info *, const char *);
454
455static inline char d_last_char (struct d_print_info *);
59727473
DD
456
457static void
ddee5e46 458d_print_comp (struct d_print_info *, int, const struct demangle_component *);
59727473
DD
459
460static void
9334f9c6 461d_print_java_identifier (struct d_print_info *, const char *, int);
59727473
DD
462
463static void
ddee5e46 464d_print_mod_list (struct d_print_info *, int, struct d_print_mod *, int);
59727473
DD
465
466static void
ddee5e46 467d_print_mod (struct d_print_info *, int, const struct demangle_component *);
59727473
DD
468
469static void
ddee5e46 470d_print_function_type (struct d_print_info *, int,
9334f9c6
DD
471 const struct demangle_component *,
472 struct d_print_mod *);
59727473
DD
473
474static void
ddee5e46 475d_print_array_type (struct d_print_info *, int,
9334f9c6
DD
476 const struct demangle_component *,
477 struct d_print_mod *);
59727473
DD
478
479static void
ddee5e46 480d_print_expr_op (struct d_print_info *, int, const struct demangle_component *);
59727473
DD
481
482static void
ddee5e46 483d_print_cast (struct d_print_info *, int, const struct demangle_component *);
59727473 484
208c1674
DD
485static int d_demangle_callback (const char *, int,
486 demangle_callbackref, void *);
9334f9c6 487static char *d_demangle (const char *, int, size_t *);
d00edca5 488
eb383413 489#ifdef CP_DEMANGLE_DEBUG
d00edca5
DD
490
491static void
9334f9c6 492d_dump (struct demangle_component *dc, int indent)
eb383413
L
493{
494 int i;
eb383413 495
d00edca5 496 if (dc == NULL)
208c1674
DD
497 {
498 if (indent == 0)
499 printf ("failed demangling\n");
500 return;
501 }
d00edca5
DD
502
503 for (i = 0; i < indent; ++i)
504 putchar (' ');
505
506 switch (dc->type)
507 {
59727473 508 case DEMANGLE_COMPONENT_NAME:
d00edca5
DD
509 printf ("name '%.*s'\n", dc->u.s_name.len, dc->u.s_name.s);
510 return;
59727473 511 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
d00edca5
DD
512 printf ("template parameter %ld\n", dc->u.s_number.number);
513 return;
59727473 514 case DEMANGLE_COMPONENT_CTOR:
d00edca5
DD
515 printf ("constructor %d\n", (int) dc->u.s_ctor.kind);
516 d_dump (dc->u.s_ctor.name, indent + 2);
517 return;
59727473 518 case DEMANGLE_COMPONENT_DTOR:
d00edca5
DD
519 printf ("destructor %d\n", (int) dc->u.s_dtor.kind);
520 d_dump (dc->u.s_dtor.name, indent + 2);
521 return;
59727473 522 case DEMANGLE_COMPONENT_SUB_STD:
d00edca5
DD
523 printf ("standard substitution %s\n", dc->u.s_string.string);
524 return;
59727473 525 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
d00edca5
DD
526 printf ("builtin type %s\n", dc->u.s_builtin.type->name);
527 return;
59727473 528 case DEMANGLE_COMPONENT_OPERATOR:
d00edca5
DD
529 printf ("operator %s\n", dc->u.s_operator.op->name);
530 return;
59727473 531 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
d00edca5
DD
532 printf ("extended operator with %d args\n",
533 dc->u.s_extended_operator.args);
534 d_dump (dc->u.s_extended_operator.name, indent + 2);
535 return;
536
59727473 537 case DEMANGLE_COMPONENT_QUAL_NAME:
d00edca5
DD
538 printf ("qualified name\n");
539 break;
59727473 540 case DEMANGLE_COMPONENT_LOCAL_NAME:
d4edd112
DD
541 printf ("local name\n");
542 break;
59727473 543 case DEMANGLE_COMPONENT_TYPED_NAME:
d00edca5
DD
544 printf ("typed name\n");
545 break;
59727473 546 case DEMANGLE_COMPONENT_TEMPLATE:
d00edca5
DD
547 printf ("template\n");
548 break;
59727473 549 case DEMANGLE_COMPONENT_VTABLE:
d00edca5
DD
550 printf ("vtable\n");
551 break;
59727473 552 case DEMANGLE_COMPONENT_VTT:
d00edca5
DD
553 printf ("VTT\n");
554 break;
59727473 555 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
d00edca5
DD
556 printf ("construction vtable\n");
557 break;
59727473 558 case DEMANGLE_COMPONENT_TYPEINFO:
d00edca5
DD
559 printf ("typeinfo\n");
560 break;
59727473 561 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
d00edca5
DD
562 printf ("typeinfo name\n");
563 break;
59727473 564 case DEMANGLE_COMPONENT_TYPEINFO_FN:
d00edca5
DD
565 printf ("typeinfo function\n");
566 break;
59727473 567 case DEMANGLE_COMPONENT_THUNK:
d00edca5
DD
568 printf ("thunk\n");
569 break;
59727473 570 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
d00edca5
DD
571 printf ("virtual thunk\n");
572 break;
59727473 573 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
d00edca5
DD
574 printf ("covariant thunk\n");
575 break;
59727473 576 case DEMANGLE_COMPONENT_JAVA_CLASS:
d00edca5
DD
577 printf ("java class\n");
578 break;
59727473 579 case DEMANGLE_COMPONENT_GUARD:
d00edca5
DD
580 printf ("guard\n");
581 break;
59727473 582 case DEMANGLE_COMPONENT_REFTEMP:
d00edca5
DD
583 printf ("reference temporary\n");
584 break;
839e4798
RH
585 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
586 printf ("hidden alias\n");
587 break;
956a8f8b
DD
588 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
589 printf ("transaction clone\n");
590 break;
591 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
592 printf ("non-transaction clone\n");
593 break;
59727473 594 case DEMANGLE_COMPONENT_RESTRICT:
d00edca5
DD
595 printf ("restrict\n");
596 break;
59727473 597 case DEMANGLE_COMPONENT_VOLATILE:
d00edca5
DD
598 printf ("volatile\n");
599 break;
59727473 600 case DEMANGLE_COMPONENT_CONST:
d00edca5
DD
601 printf ("const\n");
602 break;
59727473 603 case DEMANGLE_COMPONENT_RESTRICT_THIS:
858b45cf
DD
604 printf ("restrict this\n");
605 break;
59727473 606 case DEMANGLE_COMPONENT_VOLATILE_THIS:
858b45cf
DD
607 printf ("volatile this\n");
608 break;
59727473 609 case DEMANGLE_COMPONENT_CONST_THIS:
858b45cf
DD
610 printf ("const this\n");
611 break;
59727473 612 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
d00edca5
DD
613 printf ("vendor type qualifier\n");
614 break;
59727473 615 case DEMANGLE_COMPONENT_POINTER:
d00edca5
DD
616 printf ("pointer\n");
617 break;
59727473 618 case DEMANGLE_COMPONENT_REFERENCE:
d00edca5
DD
619 printf ("reference\n");
620 break;
8969a67f
DD
621 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
622 printf ("rvalue reference\n");
623 break;
59727473 624 case DEMANGLE_COMPONENT_COMPLEX:
d00edca5
DD
625 printf ("complex\n");
626 break;
59727473 627 case DEMANGLE_COMPONENT_IMAGINARY:
d00edca5
DD
628 printf ("imaginary\n");
629 break;
59727473 630 case DEMANGLE_COMPONENT_VENDOR_TYPE:
d00edca5
DD
631 printf ("vendor type\n");
632 break;
59727473 633 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
d00edca5
DD
634 printf ("function type\n");
635 break;
59727473 636 case DEMANGLE_COMPONENT_ARRAY_TYPE:
d00edca5
DD
637 printf ("array type\n");
638 break;
59727473 639 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
d00edca5
DD
640 printf ("pointer to member type\n");
641 break;
d2825c1a
DD
642 case DEMANGLE_COMPONENT_FIXED_TYPE:
643 printf ("fixed-point type\n");
644 break;
59727473 645 case DEMANGLE_COMPONENT_ARGLIST:
d00edca5
DD
646 printf ("argument list\n");
647 break;
59727473 648 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
d00edca5
DD
649 printf ("template argument list\n");
650 break;
eb7b5ddb
DD
651 case DEMANGLE_COMPONENT_INITIALIZER_LIST:
652 printf ("initializer list\n");
653 break;
59727473 654 case DEMANGLE_COMPONENT_CAST:
d00edca5
DD
655 printf ("cast\n");
656 break;
eb7b5ddb
DD
657 case DEMANGLE_COMPONENT_NULLARY:
658 printf ("nullary operator\n");
659 break;
59727473 660 case DEMANGLE_COMPONENT_UNARY:
d00edca5
DD
661 printf ("unary operator\n");
662 break;
59727473 663 case DEMANGLE_COMPONENT_BINARY:
d00edca5
DD
664 printf ("binary operator\n");
665 break;
59727473 666 case DEMANGLE_COMPONENT_BINARY_ARGS:
d00edca5
DD
667 printf ("binary operator arguments\n");
668 break;
59727473 669 case DEMANGLE_COMPONENT_TRINARY:
d00edca5
DD
670 printf ("trinary operator\n");
671 break;
59727473 672 case DEMANGLE_COMPONENT_TRINARY_ARG1:
d00edca5
DD
673 printf ("trinary operator arguments 1\n");
674 break;
59727473 675 case DEMANGLE_COMPONENT_TRINARY_ARG2:
d00edca5
DD
676 printf ("trinary operator arguments 1\n");
677 break;
59727473 678 case DEMANGLE_COMPONENT_LITERAL:
d00edca5
DD
679 printf ("literal\n");
680 break;
59727473 681 case DEMANGLE_COMPONENT_LITERAL_NEG:
97ceaf5b
DD
682 printf ("negative literal\n");
683 break;
830ef634
DD
684 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
685 printf ("java resource\n");
686 break;
687 case DEMANGLE_COMPONENT_COMPOUND_NAME:
688 printf ("compound name\n");
689 break;
690 case DEMANGLE_COMPONENT_CHARACTER:
691 printf ("character '%c'\n", dc->u.s_character.character);
692 return;
ba8cb4ba
DD
693 case DEMANGLE_COMPONENT_DECLTYPE:
694 printf ("decltype\n");
695 break;
1c08f2c8
DD
696 case DEMANGLE_COMPONENT_PACK_EXPANSION:
697 printf ("pack expansion\n");
698 break;
eb383413
L
699 }
700
d00edca5
DD
701 d_dump (d_left (dc), indent + 2);
702 d_dump (d_right (dc), indent + 2);
703}
704
705#endif /* CP_DEMANGLE_DEBUG */
706
59727473
DD
707/* Fill in a DEMANGLE_COMPONENT_NAME. */
708
709CP_STATIC_IF_GLIBCPP_V3
710int
9334f9c6 711cplus_demangle_fill_name (struct demangle_component *p, const char *s, int len)
59727473
DD
712{
713 if (p == NULL || s == NULL || len == 0)
714 return 0;
715 p->type = DEMANGLE_COMPONENT_NAME;
716 p->u.s_name.s = s;
717 p->u.s_name.len = len;
718 return 1;
719}
720
721/* Fill in a DEMANGLE_COMPONENT_EXTENDED_OPERATOR. */
722
723CP_STATIC_IF_GLIBCPP_V3
724int
9334f9c6
DD
725cplus_demangle_fill_extended_operator (struct demangle_component *p, int args,
726 struct demangle_component *name)
59727473
DD
727{
728 if (p == NULL || args < 0 || name == NULL)
729 return 0;
730 p->type = DEMANGLE_COMPONENT_EXTENDED_OPERATOR;
731 p->u.s_extended_operator.args = args;
732 p->u.s_extended_operator.name = name;
733 return 1;
734}
735
736/* Fill in a DEMANGLE_COMPONENT_CTOR. */
737
738CP_STATIC_IF_GLIBCPP_V3
739int
9334f9c6
DD
740cplus_demangle_fill_ctor (struct demangle_component *p,
741 enum gnu_v3_ctor_kinds kind,
742 struct demangle_component *name)
59727473
DD
743{
744 if (p == NULL
745 || name == NULL
4e55d6c3 746 || (int) kind < gnu_v3_complete_object_ctor
956a8f8b 747 || (int) kind > gnu_v3_object_ctor_group)
59727473
DD
748 return 0;
749 p->type = DEMANGLE_COMPONENT_CTOR;
750 p->u.s_ctor.kind = kind;
751 p->u.s_ctor.name = name;
752 return 1;
753}
754
755/* Fill in a DEMANGLE_COMPONENT_DTOR. */
756
757CP_STATIC_IF_GLIBCPP_V3
758int
9334f9c6
DD
759cplus_demangle_fill_dtor (struct demangle_component *p,
760 enum gnu_v3_dtor_kinds kind,
761 struct demangle_component *name)
59727473
DD
762{
763 if (p == NULL
764 || name == NULL
4e55d6c3 765 || (int) kind < gnu_v3_deleting_dtor
956a8f8b 766 || (int) kind > gnu_v3_object_dtor_group)
59727473
DD
767 return 0;
768 p->type = DEMANGLE_COMPONENT_DTOR;
769 p->u.s_dtor.kind = kind;
770 p->u.s_dtor.name = name;
771 return 1;
772}
773
d00edca5
DD
774/* Add a new component. */
775
59727473 776static struct demangle_component *
9334f9c6 777d_make_empty (struct d_info *di)
d00edca5 778{
59727473 779 struct demangle_component *p;
d00edca5
DD
780
781 if (di->next_comp >= di->num_comps)
782 return NULL;
783 p = &di->comps[di->next_comp];
d00edca5
DD
784 ++di->next_comp;
785 return p;
786}
787
788/* Add a new generic component. */
789
59727473 790static struct demangle_component *
9334f9c6
DD
791d_make_comp (struct d_info *di, enum demangle_component_type type,
792 struct demangle_component *left,
793 struct demangle_component *right)
d00edca5 794{
59727473 795 struct demangle_component *p;
d00edca5
DD
796
797 /* We check for errors here. A typical error would be a NULL return
331c3da2
DD
798 from a subroutine. We catch those here, and return NULL
799 upward. */
d00edca5
DD
800 switch (type)
801 {
802 /* These types require two parameters. */
59727473
DD
803 case DEMANGLE_COMPONENT_QUAL_NAME:
804 case DEMANGLE_COMPONENT_LOCAL_NAME:
805 case DEMANGLE_COMPONENT_TYPED_NAME:
806 case DEMANGLE_COMPONENT_TEMPLATE:
2d6520ee 807 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
59727473
DD
808 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
809 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
810 case DEMANGLE_COMPONENT_UNARY:
811 case DEMANGLE_COMPONENT_BINARY:
812 case DEMANGLE_COMPONENT_BINARY_ARGS:
813 case DEMANGLE_COMPONENT_TRINARY:
814 case DEMANGLE_COMPONENT_TRINARY_ARG1:
59727473
DD
815 case DEMANGLE_COMPONENT_LITERAL:
816 case DEMANGLE_COMPONENT_LITERAL_NEG:
830ef634 817 case DEMANGLE_COMPONENT_COMPOUND_NAME:
cbc43128 818 case DEMANGLE_COMPONENT_VECTOR_TYPE:
7955ede5 819 case DEMANGLE_COMPONENT_CLONE:
d00edca5
DD
820 if (left == NULL || right == NULL)
821 return NULL;
822 break;
823
824 /* These types only require one parameter. */
59727473
DD
825 case DEMANGLE_COMPONENT_VTABLE:
826 case DEMANGLE_COMPONENT_VTT:
59727473
DD
827 case DEMANGLE_COMPONENT_TYPEINFO:
828 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
829 case DEMANGLE_COMPONENT_TYPEINFO_FN:
830 case DEMANGLE_COMPONENT_THUNK:
831 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
832 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
833 case DEMANGLE_COMPONENT_JAVA_CLASS:
834 case DEMANGLE_COMPONENT_GUARD:
835 case DEMANGLE_COMPONENT_REFTEMP:
839e4798 836 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
956a8f8b
DD
837 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
838 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
59727473
DD
839 case DEMANGLE_COMPONENT_POINTER:
840 case DEMANGLE_COMPONENT_REFERENCE:
8969a67f 841 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
59727473
DD
842 case DEMANGLE_COMPONENT_COMPLEX:
843 case DEMANGLE_COMPONENT_IMAGINARY:
844 case DEMANGLE_COMPONENT_VENDOR_TYPE:
59727473 845 case DEMANGLE_COMPONENT_CAST:
830ef634 846 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
ba8cb4ba 847 case DEMANGLE_COMPONENT_DECLTYPE:
1c08f2c8 848 case DEMANGLE_COMPONENT_PACK_EXPANSION:
d5031754
DD
849 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
850 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
eb7b5ddb
DD
851 case DEMANGLE_COMPONENT_NULLARY:
852 case DEMANGLE_COMPONENT_TRINARY_ARG2:
d00edca5
DD
853 if (left == NULL)
854 return NULL;
855 break;
856
857 /* This needs a right parameter, but the left parameter can be
858 empty. */
59727473 859 case DEMANGLE_COMPONENT_ARRAY_TYPE:
eb7b5ddb 860 case DEMANGLE_COMPONENT_INITIALIZER_LIST:
d00edca5
DD
861 if (right == NULL)
862 return NULL;
863 break;
864
865 /* These are allowed to have no parameters--in some cases they
866 will be filled in later. */
59727473
DD
867 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
868 case DEMANGLE_COMPONENT_RESTRICT:
869 case DEMANGLE_COMPONENT_VOLATILE:
870 case DEMANGLE_COMPONENT_CONST:
871 case DEMANGLE_COMPONENT_RESTRICT_THIS:
872 case DEMANGLE_COMPONENT_VOLATILE_THIS:
873 case DEMANGLE_COMPONENT_CONST_THIS:
1c08f2c8
DD
874 case DEMANGLE_COMPONENT_ARGLIST:
875 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
d00edca5
DD
876 break;
877
878 /* Other types should not be seen here. */
879 default:
880 return NULL;
eb383413 881 }
d00edca5 882
59727473 883 p = d_make_empty (di);
d00edca5 884 if (p != NULL)
eb383413 885 {
59727473 886 p->type = type;
d00edca5
DD
887 p->u.s_binary.left = left;
888 p->u.s_binary.right = right;
eb383413 889 }
d00edca5
DD
890 return p;
891}
eb383413 892
a0692e36
L
893/* Add a new demangle mangled name component. */
894
895static struct demangle_component *
896d_make_demangle_mangled_name (struct d_info *di, const char *s)
897{
898 if (d_peek_char (di) != '_' || d_peek_next_char (di) != 'Z')
899 return d_make_name (di, s, strlen (s));
900 d_advance (di, 2);
901 return d_encoding (di, 0);
902}
903
d00edca5 904/* Add a new name component. */
03d5f569 905
59727473 906static struct demangle_component *
9334f9c6 907d_make_name (struct d_info *di, const char *s, int len)
d00edca5 908{
59727473 909 struct demangle_component *p;
03d5f569 910
59727473
DD
911 p = d_make_empty (di);
912 if (! cplus_demangle_fill_name (p, s, len))
858b45cf 913 return NULL;
d00edca5 914 return p;
eb383413
L
915}
916
d00edca5 917/* Add a new builtin type component. */
eb383413 918
59727473 919static struct demangle_component *
9334f9c6
DD
920d_make_builtin_type (struct d_info *di,
921 const struct demangle_builtin_type_info *type)
eb383413 922{
59727473 923 struct demangle_component *p;
d00edca5 924
331c3da2
DD
925 if (type == NULL)
926 return NULL;
59727473 927 p = d_make_empty (di);
d00edca5 928 if (p != NULL)
59727473
DD
929 {
930 p->type = DEMANGLE_COMPONENT_BUILTIN_TYPE;
931 p->u.s_builtin.type = type;
932 }
d00edca5
DD
933 return p;
934}
eb383413 935
d00edca5 936/* Add a new operator component. */
eb383413 937
59727473 938static struct demangle_component *
9334f9c6 939d_make_operator (struct d_info *di, const struct demangle_operator_info *op)
eb383413 940{
59727473 941 struct demangle_component *p;
d00edca5 942
59727473 943 p = d_make_empty (di);
d00edca5 944 if (p != NULL)
59727473
DD
945 {
946 p->type = DEMANGLE_COMPONENT_OPERATOR;
947 p->u.s_operator.op = op;
948 }
d00edca5 949 return p;
eb383413
L
950}
951
d00edca5 952/* Add a new extended operator component. */
eb383413 953
59727473 954static struct demangle_component *
9334f9c6
DD
955d_make_extended_operator (struct d_info *di, int args,
956 struct demangle_component *name)
eb383413 957{
59727473 958 struct demangle_component *p;
03d5f569 959
59727473
DD
960 p = d_make_empty (di);
961 if (! cplus_demangle_fill_extended_operator (p, args, name))
331c3da2 962 return NULL;
d00edca5 963 return p;
eb383413
L
964}
965
664aa91f
DD
966static struct demangle_component *
967d_make_default_arg (struct d_info *di, int num,
968 struct demangle_component *sub)
969{
970 struct demangle_component *p = d_make_empty (di);
971 if (p)
972 {
973 p->type = DEMANGLE_COMPONENT_DEFAULT_ARG;
974 p->u.s_unary_num.num = num;
975 p->u.s_unary_num.sub = sub;
976 }
977 return p;
978}
979
d00edca5 980/* Add a new constructor component. */
eb383413 981
59727473 982static struct demangle_component *
9334f9c6
DD
983d_make_ctor (struct d_info *di, enum gnu_v3_ctor_kinds kind,
984 struct demangle_component *name)
eb383413 985{
59727473 986 struct demangle_component *p;
d00edca5 987
59727473
DD
988 p = d_make_empty (di);
989 if (! cplus_demangle_fill_ctor (p, kind, name))
331c3da2 990 return NULL;
d00edca5 991 return p;
eb383413
L
992}
993
d00edca5 994/* Add a new destructor component. */
eb383413 995
59727473 996static struct demangle_component *
9334f9c6
DD
997d_make_dtor (struct d_info *di, enum gnu_v3_dtor_kinds kind,
998 struct demangle_component *name)
eb383413 999{
59727473 1000 struct demangle_component *p;
d00edca5 1001
59727473
DD
1002 p = d_make_empty (di);
1003 if (! cplus_demangle_fill_dtor (p, kind, name))
331c3da2 1004 return NULL;
d00edca5 1005 return p;
eb383413
L
1006}
1007
d00edca5 1008/* Add a new template parameter. */
59666b35 1009
59727473 1010static struct demangle_component *
9334f9c6 1011d_make_template_param (struct d_info *di, long i)
59666b35 1012{
59727473 1013 struct demangle_component *p;
d00edca5 1014
59727473 1015 p = d_make_empty (di);
d00edca5 1016 if (p != NULL)
59727473
DD
1017 {
1018 p->type = DEMANGLE_COMPONENT_TEMPLATE_PARAM;
1019 p->u.s_number.number = i;
1020 }
d00edca5 1021 return p;
59666b35
DD
1022}
1023
c743cf5d
DD
1024/* Add a new function parameter. */
1025
1026static struct demangle_component *
1027d_make_function_param (struct d_info *di, long i)
1028{
1029 struct demangle_component *p;
1030
1031 p = d_make_empty (di);
1032 if (p != NULL)
1033 {
1034 p->type = DEMANGLE_COMPONENT_FUNCTION_PARAM;
1035 p->u.s_number.number = i;
1036 }
1037 return p;
1038}
1039
d00edca5 1040/* Add a new standard substitution component. */
59666b35 1041
59727473 1042static struct demangle_component *
9334f9c6 1043d_make_sub (struct d_info *di, const char *name, int len)
59666b35 1044{
59727473 1045 struct demangle_component *p;
d00edca5 1046
59727473 1047 p = d_make_empty (di);
d00edca5 1048 if (p != NULL)
b6fb00c0 1049 {
59727473 1050 p->type = DEMANGLE_COMPONENT_SUB_STD;
b6fb00c0
DD
1051 p->u.s_string.string = name;
1052 p->u.s_string.len = len;
1053 }
d00edca5 1054 return p;
59666b35
DD
1055}
1056
7955ede5 1057/* <mangled-name> ::= _Z <encoding> [<clone-suffix>]*
331c3da2
DD
1058
1059 TOP_LEVEL is non-zero when called at the top level. */
59666b35 1060
59727473
DD
1061CP_STATIC_IF_GLIBCPP_V3
1062struct demangle_component *
9334f9c6 1063cplus_demangle_mangled_name (struct d_info *di, int top_level)
59666b35 1064{
7955ede5
DD
1065 struct demangle_component *p;
1066
c743cf5d
DD
1067 if (! d_check_char (di, '_')
1068 /* Allow missing _ if not at toplevel to work around a
1069 bug in G++ abi-version=2 mangling; see the comment in
1070 write_template_arg. */
1071 && top_level)
d00edca5 1072 return NULL;
6ef6358e 1073 if (! d_check_char (di, 'Z'))
d00edca5 1074 return NULL;
7955ede5
DD
1075 p = d_encoding (di, top_level);
1076
1077 /* If at top level and parsing parameters, check for a clone
1078 suffix. */
1079 if (top_level && (di->options & DMGL_PARAMS) != 0)
1080 while (d_peek_char (di) == '.'
1081 && (IS_LOWER (d_peek_next_char (di))
1082 || d_peek_next_char (di) == '_'
1083 || IS_DIGIT (d_peek_next_char (di))))
1084 p = d_clone_suffix (di, p);
1085
1086 return p;
59666b35
DD
1087}
1088
d00edca5
DD
1089/* Return whether a function should have a return type. The argument
1090 is the function name, which may be qualified in various ways. The
1091 rules are that template functions have return types with some
1092 exceptions, function types which are not part of a function name
1093 mangling have return types with some exceptions, and non-template
1094 function names do not have return types. The exceptions are that
1095 constructors, destructors, and conversion operators do not have
1096 return types. */
59666b35
DD
1097
1098static int
9334f9c6 1099has_return_type (struct demangle_component *dc)
59666b35 1100{
d00edca5
DD
1101 if (dc == NULL)
1102 return 0;
1103 switch (dc->type)
1104 {
1105 default:
1106 return 0;
59727473 1107 case DEMANGLE_COMPONENT_TEMPLATE:
d00edca5 1108 return ! is_ctor_dtor_or_conversion (d_left (dc));
59727473
DD
1109 case DEMANGLE_COMPONENT_RESTRICT_THIS:
1110 case DEMANGLE_COMPONENT_VOLATILE_THIS:
1111 case DEMANGLE_COMPONENT_CONST_THIS:
54a962d9 1112 return has_return_type (d_left (dc));
d00edca5 1113 }
59666b35
DD
1114}
1115
d00edca5
DD
1116/* Return whether a name is a constructor, a destructor, or a
1117 conversion operator. */
eb383413
L
1118
1119static int
9334f9c6 1120is_ctor_dtor_or_conversion (struct demangle_component *dc)
eb383413 1121{
d00edca5
DD
1122 if (dc == NULL)
1123 return 0;
1124 switch (dc->type)
1125 {
1126 default:
1127 return 0;
59727473
DD
1128 case DEMANGLE_COMPONENT_QUAL_NAME:
1129 case DEMANGLE_COMPONENT_LOCAL_NAME:
d00edca5 1130 return is_ctor_dtor_or_conversion (d_right (dc));
59727473
DD
1131 case DEMANGLE_COMPONENT_CTOR:
1132 case DEMANGLE_COMPONENT_DTOR:
1133 case DEMANGLE_COMPONENT_CAST:
d00edca5
DD
1134 return 1;
1135 }
eb383413
L
1136}
1137
d00edca5
DD
1138/* <encoding> ::= <(function) name> <bare-function-type>
1139 ::= <(data) name>
6d95373e
DD
1140 ::= <special-name>
1141
1142 TOP_LEVEL is non-zero when called at the top level, in which case
1143 if DMGL_PARAMS is not set we do not demangle the function
1144 parameters. We only set this at the top level, because otherwise
1145 we would not correctly demangle names in local scopes. */
eb383413 1146
59727473 1147static struct demangle_component *
9334f9c6 1148d_encoding (struct d_info *di, int top_level)
eb383413 1149{
d00edca5 1150 char peek = d_peek_char (di);
03d5f569 1151
d00edca5
DD
1152 if (peek == 'G' || peek == 'T')
1153 return d_special_name (di);
1154 else
03d5f569 1155 {
59727473 1156 struct demangle_component *dc;
d00edca5
DD
1157
1158 dc = d_name (di);
331c3da2
DD
1159
1160 if (dc != NULL && top_level && (di->options & DMGL_PARAMS) == 0)
1161 {
1162 /* Strip off any initial CV-qualifiers, as they really apply
1163 to the `this' parameter, and they were not output by the
1164 v2 demangler without DMGL_PARAMS. */
59727473
DD
1165 while (dc->type == DEMANGLE_COMPONENT_RESTRICT_THIS
1166 || dc->type == DEMANGLE_COMPONENT_VOLATILE_THIS
1167 || dc->type == DEMANGLE_COMPONENT_CONST_THIS)
331c3da2 1168 dc = d_left (dc);
820542c9 1169
59727473
DD
1170 /* If the top level is a DEMANGLE_COMPONENT_LOCAL_NAME, then
1171 there may be CV-qualifiers on its right argument which
1172 really apply here; this happens when parsing a class
1173 which is local to a function. */
1174 if (dc->type == DEMANGLE_COMPONENT_LOCAL_NAME)
820542c9 1175 {
59727473 1176 struct demangle_component *dcr;
820542c9
DD
1177
1178 dcr = d_right (dc);
59727473
DD
1179 while (dcr->type == DEMANGLE_COMPONENT_RESTRICT_THIS
1180 || dcr->type == DEMANGLE_COMPONENT_VOLATILE_THIS
1181 || dcr->type == DEMANGLE_COMPONENT_CONST_THIS)
820542c9
DD
1182 dcr = d_left (dcr);
1183 dc->u.s_binary.right = dcr;
1184 }
1185
331c3da2
DD
1186 return dc;
1187 }
1188
d00edca5 1189 peek = d_peek_char (di);
8d301070 1190 if (dc == NULL || peek == '\0' || peek == 'E')
d00edca5 1191 return dc;
59727473 1192 return d_make_comp (di, DEMANGLE_COMPONENT_TYPED_NAME, dc,
d00edca5 1193 d_bare_function_type (di, has_return_type (dc)));
03d5f569 1194 }
d00edca5
DD
1195}
1196
1197/* <name> ::= <nested-name>
1198 ::= <unscoped-name>
1199 ::= <unscoped-template-name> <template-args>
1200 ::= <local-name>
1201
1202 <unscoped-name> ::= <unqualified-name>
1203 ::= St <unqualified-name>
eb383413 1204
d00edca5
DD
1205 <unscoped-template-name> ::= <unscoped-name>
1206 ::= <substitution>
1207*/
1208
59727473 1209static struct demangle_component *
9334f9c6 1210d_name (struct d_info *di)
d00edca5
DD
1211{
1212 char peek = d_peek_char (di);
59727473 1213 struct demangle_component *dc;
d00edca5
DD
1214
1215 switch (peek)
eb383413 1216 {
d00edca5
DD
1217 case 'N':
1218 return d_nested_name (di);
1219
1220 case 'Z':
1221 return d_local_name (di);
1222
8bf955e1 1223 case 'L':
664aa91f 1224 case 'U':
8bf955e1 1225 return d_unqualified_name (di);
664aa91f 1226
d00edca5
DD
1227 case 'S':
1228 {
1229 int subst;
1230
1231 if (d_peek_next_char (di) != 't')
1232 {
97ceaf5b 1233 dc = d_substitution (di, 0);
d00edca5
DD
1234 subst = 1;
1235 }
1236 else
1237 {
1238 d_advance (di, 2);
59727473
DD
1239 dc = d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME,
1240 d_make_name (di, "std", 3),
d00edca5 1241 d_unqualified_name (di));
b6fb00c0 1242 di->expansion += 3;
d00edca5
DD
1243 subst = 0;
1244 }
1245
1246 if (d_peek_char (di) != 'I')
1247 {
1248 /* The grammar does not permit this case to occur if we
1249 called d_substitution() above (i.e., subst == 1). We
1250 don't bother to check. */
1251 }
1252 else
1253 {
1254 /* This is <template-args>, which means that we just saw
1255 <unscoped-template-name>, which is a substitution
1256 candidate if we didn't just get it from a
1257 substitution. */
1258 if (! subst)
1259 {
1260 if (! d_add_substitution (di, dc))
1261 return NULL;
1262 }
59727473
DD
1263 dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc,
1264 d_template_args (di));
d00edca5
DD
1265 }
1266
1267 return dc;
1268 }
1269
1270 default:
1271 dc = d_unqualified_name (di);
1272 if (d_peek_char (di) == 'I')
03d5f569 1273 {
d00edca5
DD
1274 /* This is <template-args>, which means that we just saw
1275 <unscoped-template-name>, which is a substitution
1276 candidate. */
1277 if (! d_add_substitution (di, dc))
1278 return NULL;
59727473
DD
1279 dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc,
1280 d_template_args (di));
03d5f569 1281 }
d00edca5 1282 return dc;
eb383413 1283 }
d00edca5 1284}
eb383413 1285
d00edca5
DD
1286/* <nested-name> ::= N [<CV-qualifiers>] <prefix> <unqualified-name> E
1287 ::= N [<CV-qualifiers>] <template-prefix> <template-args> E
1288*/
eb383413 1289
59727473 1290static struct demangle_component *
9334f9c6 1291d_nested_name (struct d_info *di)
d00edca5 1292{
59727473
DD
1293 struct demangle_component *ret;
1294 struct demangle_component **pret;
03d5f569 1295
6ef6358e 1296 if (! d_check_char (di, 'N'))
d00edca5 1297 return NULL;
eb383413 1298
858b45cf 1299 pret = d_cv_qualifiers (di, &ret, 1);
d00edca5
DD
1300 if (pret == NULL)
1301 return NULL;
1302
1303 *pret = d_prefix (di);
1304 if (*pret == NULL)
1305 return NULL;
eb383413 1306
6ef6358e 1307 if (! d_check_char (di, 'E'))
eb383413
L
1308 return NULL;
1309
d00edca5 1310 return ret;
eb383413
L
1311}
1312
d00edca5
DD
1313/* <prefix> ::= <prefix> <unqualified-name>
1314 ::= <template-prefix> <template-args>
1315 ::= <template-param>
6b6bd65a 1316 ::= <decltype>
d00edca5
DD
1317 ::=
1318 ::= <substitution>
eb383413 1319
d00edca5
DD
1320 <template-prefix> ::= <prefix> <(template) unqualified-name>
1321 ::= <template-param>
1322 ::= <substitution>
1323*/
1324
59727473 1325static struct demangle_component *
9334f9c6 1326d_prefix (struct d_info *di)
eb383413 1327{
59727473 1328 struct demangle_component *ret = NULL;
eb383413 1329
d00edca5 1330 while (1)
eb383413 1331 {
d00edca5 1332 char peek;
59727473
DD
1333 enum demangle_component_type comb_type;
1334 struct demangle_component *dc;
d00edca5
DD
1335
1336 peek = d_peek_char (di);
1337 if (peek == '\0')
1338 return NULL;
1339
1340 /* The older code accepts a <local-name> here, but I don't see
1341 that in the grammar. The older code does not accept a
1342 <template-param> here. */
eb383413 1343
59727473 1344 comb_type = DEMANGLE_COMPONENT_QUAL_NAME;
6b6bd65a
DD
1345 if (peek == 'D')
1346 {
1347 char peek2 = d_peek_next_char (di);
1348 if (peek2 == 'T' || peek2 == 't')
1349 /* Decltype. */
1350 dc = cplus_demangle_type (di);
1351 else
1352 /* Destructor name. */
1353 dc = d_unqualified_name (di);
1354 }
1355 else if (IS_DIGIT (peek)
858b45cf 1356 || IS_LOWER (peek)
d00edca5 1357 || peek == 'C'
664aa91f 1358 || peek == 'U'
8bf955e1 1359 || peek == 'L')
d00edca5
DD
1360 dc = d_unqualified_name (di);
1361 else if (peek == 'S')
97ceaf5b 1362 dc = d_substitution (di, 1);
d00edca5
DD
1363 else if (peek == 'I')
1364 {
1365 if (ret == NULL)
1366 return NULL;
59727473 1367 comb_type = DEMANGLE_COMPONENT_TEMPLATE;
d00edca5
DD
1368 dc = d_template_args (di);
1369 }
1370 else if (peek == 'T')
1371 dc = d_template_param (di);
1372 else if (peek == 'E')
1373 return ret;
664aa91f
DD
1374 else if (peek == 'M')
1375 {
1376 /* Initializer scope for a lambda. We don't need to represent
1377 this; the normal code will just treat the variable as a type
1378 scope, which gives appropriate output. */
1379 if (ret == NULL)
1380 return NULL;
1381 d_advance (di, 1);
1382 continue;
1383 }
d00edca5
DD
1384 else
1385 return NULL;
1386
1387 if (ret == NULL)
1388 ret = dc;
eb383413 1389 else
d00edca5
DD
1390 ret = d_make_comp (di, comb_type, ret, dc);
1391
1392 if (peek != 'S' && d_peek_char (di) != 'E')
1393 {
1394 if (! d_add_substitution (di, ret))
1395 return NULL;
1396 }
eb383413
L
1397 }
1398}
1399
d00edca5
DD
1400/* <unqualified-name> ::= <operator-name>
1401 ::= <ctor-dtor-name>
1402 ::= <source-name>
8bf955e1
GK
1403 ::= <local-source-name>
1404
1405 <local-source-name> ::= L <source-name> <discriminator>
d00edca5 1406*/
eb383413 1407
59727473 1408static struct demangle_component *
9334f9c6 1409d_unqualified_name (struct d_info *di)
eb383413 1410{
d00edca5
DD
1411 char peek;
1412
1413 peek = d_peek_char (di);
1414 if (IS_DIGIT (peek))
1415 return d_source_name (di);
858b45cf 1416 else if (IS_LOWER (peek))
b6fb00c0 1417 {
59727473 1418 struct demangle_component *ret;
b6fb00c0
DD
1419
1420 ret = d_operator_name (di);
59727473 1421 if (ret != NULL && ret->type == DEMANGLE_COMPONENT_OPERATOR)
4e3aa408
DD
1422 {
1423 di->expansion += sizeof "operator" + ret->u.s_operator.op->len - 2;
1424 if (!strcmp (ret->u.s_operator.op->code, "li"))
1425 ret = d_make_comp (di, DEMANGLE_COMPONENT_UNARY, ret,
1426 d_source_name (di));
1427 }
b6fb00c0
DD
1428 return ret;
1429 }
d00edca5
DD
1430 else if (peek == 'C' || peek == 'D')
1431 return d_ctor_dtor_name (di);
8bf955e1
GK
1432 else if (peek == 'L')
1433 {
1434 struct demangle_component * ret;
1435
1436 d_advance (di, 1);
1437
1438 ret = d_source_name (di);
1439 if (ret == NULL)
1440 return NULL;
1441 if (! d_discriminator (di))
1442 return NULL;
1443 return ret;
1444 }
664aa91f
DD
1445 else if (peek == 'U')
1446 {
1447 switch (d_peek_next_char (di))
1448 {
1449 case 'l':
1450 return d_lambda (di);
1451 case 't':
1452 return d_unnamed_type (di);
1453 default:
1454 return NULL;
1455 }
1456 }
d00edca5 1457 else
03d5f569 1458 return NULL;
eb383413
L
1459}
1460
d00edca5 1461/* <source-name> ::= <(positive length) number> <identifier> */
eb383413 1462
59727473 1463static struct demangle_component *
9334f9c6 1464d_source_name (struct d_info *di)
eb383413 1465{
d00edca5 1466 long len;
59727473 1467 struct demangle_component *ret;
d00edca5
DD
1468
1469 len = d_number (di);
1470 if (len <= 0)
1471 return NULL;
1472 ret = d_identifier (di, len);
1473 di->last_name = ret;
1474 return ret;
eb383413
L
1475}
1476
d00edca5 1477/* number ::= [n] <(non-negative decimal integer)> */
eb383413 1478
d00edca5 1479static long
9334f9c6 1480d_number (struct d_info *di)
eb383413 1481{
b6fb00c0 1482 int negative;
d00edca5
DD
1483 char peek;
1484 long ret;
eb383413 1485
b6fb00c0 1486 negative = 0;
d00edca5
DD
1487 peek = d_peek_char (di);
1488 if (peek == 'n')
1489 {
b6fb00c0 1490 negative = 1;
d00edca5
DD
1491 d_advance (di, 1);
1492 peek = d_peek_char (di);
1493 }
eb383413 1494
d00edca5
DD
1495 ret = 0;
1496 while (1)
eb383413 1497 {
d00edca5 1498 if (! IS_DIGIT (peek))
b6fb00c0
DD
1499 {
1500 if (negative)
1501 ret = - ret;
1502 return ret;
1503 }
d00edca5
DD
1504 ret = ret * 10 + peek - '0';
1505 d_advance (di, 1);
1506 peek = d_peek_char (di);
eb383413 1507 }
eb383413
L
1508}
1509
cbc43128
DD
1510/* Like d_number, but returns a demangle_component. */
1511
1512static struct demangle_component *
1513d_number_component (struct d_info *di)
1514{
1515 struct demangle_component *ret = d_make_empty (di);
1516 if (ret)
1517 {
1518 ret->type = DEMANGLE_COMPONENT_NUMBER;
1519 ret->u.s_number.number = d_number (di);
1520 }
1521 return ret;
1522}
1523
d00edca5 1524/* identifier ::= <(unqualified source code identifier)> */
eb383413 1525
59727473 1526static struct demangle_component *
9334f9c6 1527d_identifier (struct d_info *di, int len)
eb383413 1528{
d00edca5 1529 const char *name;
eb383413 1530
d00edca5 1531 name = d_str (di);
b6fb00c0
DD
1532
1533 if (di->send - name < len)
1534 return NULL;
1535
d00edca5 1536 d_advance (di, len);
eb383413 1537
2730f651
DD
1538 /* A Java mangled name may have a trailing '$' if it is a C++
1539 keyword. This '$' is not included in the length count. We just
1540 ignore the '$'. */
1541 if ((di->options & DMGL_JAVA) != 0
1542 && d_peek_char (di) == '$')
1543 d_advance (di, 1);
1544
d00edca5
DD
1545 /* Look for something which looks like a gcc encoding of an
1546 anonymous namespace, and replace it with a more user friendly
1547 name. */
1548 if (len >= (int) ANONYMOUS_NAMESPACE_PREFIX_LEN + 2
1549 && memcmp (name, ANONYMOUS_NAMESPACE_PREFIX,
1550 ANONYMOUS_NAMESPACE_PREFIX_LEN) == 0)
eb383413 1551 {
d00edca5
DD
1552 const char *s;
1553
1554 s = name + ANONYMOUS_NAMESPACE_PREFIX_LEN;
1555 if ((*s == '.' || *s == '_' || *s == '$')
1556 && s[1] == 'N')
b6fb00c0
DD
1557 {
1558 di->expansion -= len - sizeof "(anonymous namespace)";
1559 return d_make_name (di, "(anonymous namespace)",
1560 sizeof "(anonymous namespace)" - 1);
1561 }
eb383413 1562 }
d00edca5
DD
1563
1564 return d_make_name (di, name, len);
eb383413
L
1565}
1566
d00edca5
DD
1567/* operator_name ::= many different two character encodings.
1568 ::= cv <type>
1569 ::= v <digit> <source-name>
eb7b5ddb
DD
1570
1571 This list is sorted for binary search. */
eb383413 1572
b6fb00c0
DD
1573#define NL(s) s, (sizeof s) - 1
1574
59727473
DD
1575CP_STATIC_IF_GLIBCPP_V3
1576const struct demangle_operator_info cplus_demangle_operators[] =
d00edca5 1577{
b6fb00c0
DD
1578 { "aN", NL ("&="), 2 },
1579 { "aS", NL ("="), 2 },
1580 { "aa", NL ("&&"), 2 },
1581 { "ad", NL ("&"), 1 },
1582 { "an", NL ("&"), 2 },
eb7b5ddb
DD
1583 { "at", NL ("alignof "), 1 },
1584 { "az", NL ("alignof "), 1 },
7c328963 1585 { "cc", NL ("const_cast"), 2 },
ba8cb4ba 1586 { "cl", NL ("()"), 2 },
b6fb00c0
DD
1587 { "cm", NL (","), 2 },
1588 { "co", NL ("~"), 1 },
1589 { "dV", NL ("/="), 2 },
eb7b5ddb 1590 { "da", NL ("delete[] "), 1 },
7c328963 1591 { "dc", NL ("dynamic_cast"), 2 },
b6fb00c0 1592 { "de", NL ("*"), 1 },
eb7b5ddb
DD
1593 { "dl", NL ("delete "), 1 },
1594 { "ds", NL (".*"), 2 },
1c08f2c8 1595 { "dt", NL ("."), 2 },
b6fb00c0
DD
1596 { "dv", NL ("/"), 2 },
1597 { "eO", NL ("^="), 2 },
1598 { "eo", NL ("^"), 2 },
1599 { "eq", NL ("=="), 2 },
1600 { "ge", NL (">="), 2 },
eb7b5ddb 1601 { "gs", NL ("::"), 1 },
b6fb00c0
DD
1602 { "gt", NL (">"), 2 },
1603 { "ix", NL ("[]"), 2 },
1604 { "lS", NL ("<<="), 2 },
1605 { "le", NL ("<="), 2 },
4e3aa408 1606 { "li", NL ("operator\"\" "), 1 },
b6fb00c0
DD
1607 { "ls", NL ("<<"), 2 },
1608 { "lt", NL ("<"), 2 },
1609 { "mI", NL ("-="), 2 },
1610 { "mL", NL ("*="), 2 },
1611 { "mi", NL ("-"), 2 },
1612 { "ml", NL ("*"), 2 },
1613 { "mm", NL ("--"), 1 },
eb7b5ddb 1614 { "na", NL ("new[]"), 3 },
b6fb00c0
DD
1615 { "ne", NL ("!="), 2 },
1616 { "ng", NL ("-"), 1 },
1617 { "nt", NL ("!"), 1 },
eb7b5ddb 1618 { "nw", NL ("new"), 3 },
b6fb00c0
DD
1619 { "oR", NL ("|="), 2 },
1620 { "oo", NL ("||"), 2 },
1621 { "or", NL ("|"), 2 },
1622 { "pL", NL ("+="), 2 },
1623 { "pl", NL ("+"), 2 },
1624 { "pm", NL ("->*"), 2 },
1625 { "pp", NL ("++"), 1 },
1626 { "ps", NL ("+"), 1 },
1627 { "pt", NL ("->"), 2 },
1628 { "qu", NL ("?"), 3 },
1629 { "rM", NL ("%="), 2 },
1630 { "rS", NL (">>="), 2 },
7c328963 1631 { "rc", NL ("reinterpret_cast"), 2 },
b6fb00c0
DD
1632 { "rm", NL ("%"), 2 },
1633 { "rs", NL (">>"), 2 },
7c328963 1634 { "sc", NL ("static_cast"), 2 },
b6fb00c0 1635 { "st", NL ("sizeof "), 1 },
59727473 1636 { "sz", NL ("sizeof "), 1 },
eb7b5ddb
DD
1637 { "tr", NL ("throw"), 0 },
1638 { "tw", NL ("throw "), 1 },
59727473 1639 { NULL, NULL, 0, 0 }
d00edca5 1640};
eb383413 1641
59727473 1642static struct demangle_component *
9334f9c6 1643d_operator_name (struct d_info *di)
eb383413 1644{
d00edca5
DD
1645 char c1;
1646 char c2;
eb383413 1647
d00edca5
DD
1648 c1 = d_next_char (di);
1649 c2 = d_next_char (di);
1650 if (c1 == 'v' && IS_DIGIT (c2))
1651 return d_make_extended_operator (di, c2 - '0', d_source_name (di));
1652 else if (c1 == 'c' && c2 == 'v')
59727473
DD
1653 return d_make_comp (di, DEMANGLE_COMPONENT_CAST,
1654 cplus_demangle_type (di), NULL);
d00edca5 1655 else
eb383413 1656 {
59727473 1657 /* LOW is the inclusive lower bound. */
d00edca5 1658 int low = 0;
59727473
DD
1659 /* HIGH is the exclusive upper bound. We subtract one to ignore
1660 the sentinel at the end of the array. */
1661 int high = ((sizeof (cplus_demangle_operators)
1662 / sizeof (cplus_demangle_operators[0]))
1663 - 1);
eb383413 1664
d00edca5
DD
1665 while (1)
1666 {
1667 int i;
59727473 1668 const struct demangle_operator_info *p;
eb383413 1669
d00edca5 1670 i = low + (high - low) / 2;
59727473 1671 p = cplus_demangle_operators + i;
eb383413 1672
d00edca5
DD
1673 if (c1 == p->code[0] && c2 == p->code[1])
1674 return d_make_operator (di, p);
1675
1676 if (c1 < p->code[0] || (c1 == p->code[0] && c2 < p->code[1]))
1677 high = i;
1678 else
1679 low = i + 1;
1680 if (low == high)
1681 return NULL;
1682 }
1683 }
eb383413
L
1684}
1685
830ef634
DD
1686static struct demangle_component *
1687d_make_character (struct d_info *di, int c)
1688{
1689 struct demangle_component *p;
1690 p = d_make_empty (di);
1691 if (p != NULL)
1692 {
1693 p->type = DEMANGLE_COMPONENT_CHARACTER;
1694 p->u.s_character.character = c;
1695 }
1696 return p;
1697}
1698
1699static struct demangle_component *
1700d_java_resource (struct d_info *di)
1701{
1702 struct demangle_component *p = NULL;
1703 struct demangle_component *next = NULL;
1704 long len, i;
1705 char c;
1706 const char *str;
1707
1708 len = d_number (di);
1709 if (len <= 1)
1710 return NULL;
1711
1712 /* Eat the leading '_'. */
1713 if (d_next_char (di) != '_')
1714 return NULL;
1715 len--;
1716
1717 str = d_str (di);
1718 i = 0;
1719
1720 while (len > 0)
1721 {
1722 c = str[i];
1723 if (!c)
1724 return NULL;
1725
1726 /* Each chunk is either a '$' escape... */
1727 if (c == '$')
1728 {
1729 i++;
1730 switch (str[i++])
1731 {
1732 case 'S':
1733 c = '/';
1734 break;
1735 case '_':
1736 c = '.';
1737 break;
1738 case '$':
1739 c = '$';
1740 break;
1741 default:
1742 return NULL;
1743 }
1744 next = d_make_character (di, c);
1745 d_advance (di, i);
1746 str = d_str (di);
1747 len -= i;
1748 i = 0;
1749 if (next == NULL)
1750 return NULL;
1751 }
1752 /* ... or a sequence of characters. */
1753 else
1754 {
1755 while (i < len && str[i] && str[i] != '$')
1756 i++;
1757
1758 next = d_make_name (di, str, i);
1759 d_advance (di, i);
1760 str = d_str (di);
1761 len -= i;
1762 i = 0;
1763 if (next == NULL)
1764 return NULL;
1765 }
1766
1767 if (p == NULL)
1768 p = next;
1769 else
1770 {
1771 p = d_make_comp (di, DEMANGLE_COMPONENT_COMPOUND_NAME, p, next);
1772 if (p == NULL)
1773 return NULL;
1774 }
1775 }
1776
1777 p = d_make_comp (di, DEMANGLE_COMPONENT_JAVA_RESOURCE, p, NULL);
1778
1779 return p;
1780}
1781
d00edca5
DD
1782/* <special-name> ::= TV <type>
1783 ::= TT <type>
1784 ::= TI <type>
1785 ::= TS <type>
1786 ::= GV <(object) name>
1787 ::= T <call-offset> <(base) encoding>
1788 ::= Tc <call-offset> <call-offset> <(base) encoding>
1789 Also g++ extensions:
1790 ::= TC <type> <(offset) number> _ <(base) type>
1791 ::= TF <type>
1792 ::= TJ <type>
1793 ::= GR <name>
839e4798 1794 ::= GA <encoding>
830ef634 1795 ::= Gr <resource name>
956a8f8b
DD
1796 ::= GTt <encoding>
1797 ::= GTn <encoding>
d00edca5 1798*/
eb383413 1799
59727473 1800static struct demangle_component *
9334f9c6 1801d_special_name (struct d_info *di)
eb383413 1802{
b6fb00c0 1803 di->expansion += 20;
6ef6358e 1804 if (d_check_char (di, 'T'))
03d5f569 1805 {
d00edca5
DD
1806 switch (d_next_char (di))
1807 {
1808 case 'V':
b6fb00c0 1809 di->expansion -= 5;
59727473
DD
1810 return d_make_comp (di, DEMANGLE_COMPONENT_VTABLE,
1811 cplus_demangle_type (di), NULL);
d00edca5 1812 case 'T':
b6fb00c0 1813 di->expansion -= 10;
59727473
DD
1814 return d_make_comp (di, DEMANGLE_COMPONENT_VTT,
1815 cplus_demangle_type (di), NULL);
d00edca5 1816 case 'I':
59727473
DD
1817 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO,
1818 cplus_demangle_type (di), NULL);
d00edca5 1819 case 'S':
59727473
DD
1820 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_NAME,
1821 cplus_demangle_type (di), NULL);
eb383413 1822
d00edca5
DD
1823 case 'h':
1824 if (! d_call_offset (di, 'h'))
1825 return NULL;
59727473
DD
1826 return d_make_comp (di, DEMANGLE_COMPONENT_THUNK,
1827 d_encoding (di, 0), NULL);
eb383413 1828
d00edca5
DD
1829 case 'v':
1830 if (! d_call_offset (di, 'v'))
1831 return NULL;
59727473
DD
1832 return d_make_comp (di, DEMANGLE_COMPONENT_VIRTUAL_THUNK,
1833 d_encoding (di, 0), NULL);
eb383413 1834
d00edca5
DD
1835 case 'c':
1836 if (! d_call_offset (di, '\0'))
1837 return NULL;
1838 if (! d_call_offset (di, '\0'))
1839 return NULL;
59727473
DD
1840 return d_make_comp (di, DEMANGLE_COMPONENT_COVARIANT_THUNK,
1841 d_encoding (di, 0), NULL);
eb383413 1842
d00edca5
DD
1843 case 'C':
1844 {
59727473 1845 struct demangle_component *derived_type;
d00edca5 1846 long offset;
59727473 1847 struct demangle_component *base_type;
d00edca5 1848
59727473 1849 derived_type = cplus_demangle_type (di);
d00edca5
DD
1850 offset = d_number (di);
1851 if (offset < 0)
1852 return NULL;
6ef6358e 1853 if (! d_check_char (di, '_'))
d00edca5 1854 return NULL;
59727473 1855 base_type = cplus_demangle_type (di);
d00edca5
DD
1856 /* We don't display the offset. FIXME: We should display
1857 it in verbose mode. */
b6fb00c0 1858 di->expansion += 5;
59727473
DD
1859 return d_make_comp (di, DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE,
1860 base_type, derived_type);
d00edca5 1861 }
eb383413 1862
d00edca5 1863 case 'F':
59727473
DD
1864 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_FN,
1865 cplus_demangle_type (di), NULL);
d00edca5 1866 case 'J':
59727473
DD
1867 return d_make_comp (di, DEMANGLE_COMPONENT_JAVA_CLASS,
1868 cplus_demangle_type (di), NULL);
eb383413 1869
d00edca5
DD
1870 default:
1871 return NULL;
1872 }
eb383413 1873 }
6ef6358e 1874 else if (d_check_char (di, 'G'))
eb383413 1875 {
d00edca5
DD
1876 switch (d_next_char (di))
1877 {
1878 case 'V':
59727473 1879 return d_make_comp (di, DEMANGLE_COMPONENT_GUARD, d_name (di), NULL);
d00edca5
DD
1880
1881 case 'R':
abc6552b
DD
1882 {
1883 struct demangle_component *name = d_name (di);
1884 return d_make_comp (di, DEMANGLE_COMPONENT_REFTEMP, name,
1885 d_number_component (di));
1886 }
d00edca5 1887
839e4798
RH
1888 case 'A':
1889 return d_make_comp (di, DEMANGLE_COMPONENT_HIDDEN_ALIAS,
1890 d_encoding (di, 0), NULL);
1891
956a8f8b
DD
1892 case 'T':
1893 switch (d_next_char (di))
1894 {
1895 case 'n':
1896 return d_make_comp (di, DEMANGLE_COMPONENT_NONTRANSACTION_CLONE,
1897 d_encoding (di, 0), NULL);
1898 default:
1899 /* ??? The proposal is that other letters (such as 'h') stand
1900 for different variants of transaction cloning, such as
1901 compiling directly for hardware transaction support. But
1902 they still should all be transactional clones of some sort
1903 so go ahead and call them that. */
1904 case 't':
1905 return d_make_comp (di, DEMANGLE_COMPONENT_TRANSACTION_CLONE,
1906 d_encoding (di, 0), NULL);
1907 }
1908
830ef634
DD
1909 case 'r':
1910 return d_java_resource (di);
1911
d00edca5
DD
1912 default:
1913 return NULL;
1914 }
eb383413 1915 }
d00edca5
DD
1916 else
1917 return NULL;
eb383413
L
1918}
1919
d00edca5
DD
1920/* <call-offset> ::= h <nv-offset> _
1921 ::= v <v-offset> _
eb383413 1922
d00edca5 1923 <nv-offset> ::= <(offset) number>
eb383413 1924
d00edca5 1925 <v-offset> ::= <(offset) number> _ <(virtual offset) number>
eb383413 1926
d00edca5
DD
1927 The C parameter, if not '\0', is a character we just read which is
1928 the start of the <call-offset>.
eb383413 1929
d00edca5
DD
1930 We don't display the offset information anywhere. FIXME: We should
1931 display it in verbose mode. */
eb383413 1932
d00edca5 1933static int
9334f9c6 1934d_call_offset (struct d_info *di, int c)
eb383413 1935{
d00edca5
DD
1936 if (c == '\0')
1937 c = d_next_char (di);
eb383413 1938
d00edca5 1939 if (c == 'h')
eb129e35 1940 d_number (di);
d00edca5 1941 else if (c == 'v')
eb383413 1942 {
eb129e35 1943 d_number (di);
6ef6358e 1944 if (! d_check_char (di, '_'))
d00edca5 1945 return 0;
eb129e35 1946 d_number (di);
eb383413 1947 }
d00edca5
DD
1948 else
1949 return 0;
eb383413 1950
6ef6358e 1951 if (! d_check_char (di, '_'))
d00edca5 1952 return 0;
eb383413 1953
d00edca5 1954 return 1;
eb383413
L
1955}
1956
d00edca5
DD
1957/* <ctor-dtor-name> ::= C1
1958 ::= C2
1959 ::= C3
1960 ::= D0
1961 ::= D1
1962 ::= D2
1963*/
1964
59727473 1965static struct demangle_component *
9334f9c6 1966d_ctor_dtor_name (struct d_info *di)
d00edca5 1967{
b6fb00c0
DD
1968 if (di->last_name != NULL)
1969 {
59727473 1970 if (di->last_name->type == DEMANGLE_COMPONENT_NAME)
b6fb00c0 1971 di->expansion += di->last_name->u.s_name.len;
59727473 1972 else if (di->last_name->type == DEMANGLE_COMPONENT_SUB_STD)
b6fb00c0
DD
1973 di->expansion += di->last_name->u.s_string.len;
1974 }
6ef6358e 1975 switch (d_peek_char (di))
d00edca5
DD
1976 {
1977 case 'C':
1978 {
1979 enum gnu_v3_ctor_kinds kind;
1980
6ef6358e 1981 switch (d_peek_next_char (di))
d00edca5
DD
1982 {
1983 case '1':
1984 kind = gnu_v3_complete_object_ctor;
1985 break;
1986 case '2':
1987 kind = gnu_v3_base_object_ctor;
1988 break;
1989 case '3':
1990 kind = gnu_v3_complete_object_allocating_ctor;
1991 break;
956a8f8b
DD
1992 case '5':
1993 kind = gnu_v3_object_ctor_group;
1994 break;
d00edca5
DD
1995 default:
1996 return NULL;
1997 }
6ef6358e 1998 d_advance (di, 2);
d00edca5
DD
1999 return d_make_ctor (di, kind, di->last_name);
2000 }
2001
2002 case 'D':
2003 {
2004 enum gnu_v3_dtor_kinds kind;
2005
6ef6358e 2006 switch (d_peek_next_char (di))
d00edca5
DD
2007 {
2008 case '0':
2009 kind = gnu_v3_deleting_dtor;
2010 break;
2011 case '1':
2012 kind = gnu_v3_complete_object_dtor;
2013 break;
2014 case '2':
2015 kind = gnu_v3_base_object_dtor;
2016 break;
956a8f8b
DD
2017 case '5':
2018 kind = gnu_v3_object_dtor_group;
2019 break;
d00edca5
DD
2020 default:
2021 return NULL;
2022 }
6ef6358e 2023 d_advance (di, 2);
d00edca5
DD
2024 return d_make_dtor (di, kind, di->last_name);
2025 }
eb383413 2026
d00edca5
DD
2027 default:
2028 return NULL;
2029 }
2030}
eb383413 2031
d00edca5
DD
2032/* <type> ::= <builtin-type>
2033 ::= <function-type>
2034 ::= <class-enum-type>
2035 ::= <array-type>
2036 ::= <pointer-to-member-type>
2037 ::= <template-param>
2038 ::= <template-template-param> <template-args>
2039 ::= <substitution>
2040 ::= <CV-qualifiers> <type>
2041 ::= P <type>
2042 ::= R <type>
8969a67f 2043 ::= O <type> (C++0x)
d00edca5
DD
2044 ::= C <type>
2045 ::= G <type>
2046 ::= U <source-name> <type>
2047
2048 <builtin-type> ::= various one letter codes
2049 ::= u <source-name>
2050*/
eb383413 2051
59727473
DD
2052CP_STATIC_IF_GLIBCPP_V3
2053const struct demangle_builtin_type_info
2054cplus_demangle_builtin_types[D_BUILTIN_TYPE_COUNT] =
d00edca5 2055{
2d733211 2056 /* a */ { NL ("signed char"), NL ("signed char"), D_PRINT_DEFAULT },
b6fb00c0 2057 /* b */ { NL ("bool"), NL ("boolean"), D_PRINT_BOOL },
2d733211
DD
2058 /* c */ { NL ("char"), NL ("byte"), D_PRINT_DEFAULT },
2059 /* d */ { NL ("double"), NL ("double"), D_PRINT_FLOAT },
2060 /* e */ { NL ("long double"), NL ("long double"), D_PRINT_FLOAT },
2061 /* f */ { NL ("float"), NL ("float"), D_PRINT_FLOAT },
2062 /* g */ { NL ("__float128"), NL ("__float128"), D_PRINT_FLOAT },
2063 /* h */ { NL ("unsigned char"), NL ("unsigned char"), D_PRINT_DEFAULT },
b6fb00c0 2064 /* i */ { NL ("int"), NL ("int"), D_PRINT_INT },
2d733211 2065 /* j */ { NL ("unsigned int"), NL ("unsigned"), D_PRINT_UNSIGNED },
b6fb00c0
DD
2066 /* k */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2067 /* l */ { NL ("long"), NL ("long"), D_PRINT_LONG },
2d733211 2068 /* m */ { NL ("unsigned long"), NL ("unsigned long"), D_PRINT_UNSIGNED_LONG },
b6fb00c0 2069 /* n */ { NL ("__int128"), NL ("__int128"), D_PRINT_DEFAULT },
2d733211
DD
2070 /* o */ { NL ("unsigned __int128"), NL ("unsigned __int128"),
2071 D_PRINT_DEFAULT },
1c08f2c8
DD
2072 /* p */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2073 /* q */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2074 /* r */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2d733211
DD
2075 /* s */ { NL ("short"), NL ("short"), D_PRINT_DEFAULT },
2076 /* t */ { NL ("unsigned short"), NL ("unsigned short"), D_PRINT_DEFAULT },
1c08f2c8 2077 /* u */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
b6fb00c0 2078 /* v */ { NL ("void"), NL ("void"), D_PRINT_VOID },
2d733211
DD
2079 /* w */ { NL ("wchar_t"), NL ("char"), D_PRINT_DEFAULT },
2080 /* x */ { NL ("long long"), NL ("long"), D_PRINT_LONG_LONG },
2081 /* y */ { NL ("unsigned long long"), NL ("unsigned long long"),
2082 D_PRINT_UNSIGNED_LONG_LONG },
b6fb00c0 2083 /* z */ { NL ("..."), NL ("..."), D_PRINT_DEFAULT },
1c08f2c8
DD
2084 /* 26 */ { NL ("decimal32"), NL ("decimal32"), D_PRINT_DEFAULT },
2085 /* 27 */ { NL ("decimal64"), NL ("decimal64"), D_PRINT_DEFAULT },
2086 /* 28 */ { NL ("decimal128"), NL ("decimal128"), D_PRINT_DEFAULT },
2087 /* 29 */ { NL ("half"), NL ("half"), D_PRINT_FLOAT },
2088 /* 30 */ { NL ("char16_t"), NL ("char16_t"), D_PRINT_DEFAULT },
2089 /* 31 */ { NL ("char32_t"), NL ("char32_t"), D_PRINT_DEFAULT },
cf383746
DD
2090 /* 32 */ { NL ("decltype(nullptr)"), NL ("decltype(nullptr)"),
2091 D_PRINT_DEFAULT },
d00edca5 2092};
eb383413 2093
59727473
DD
2094CP_STATIC_IF_GLIBCPP_V3
2095struct demangle_component *
9334f9c6 2096cplus_demangle_type (struct d_info *di)
eb383413 2097{
d00edca5 2098 char peek;
59727473 2099 struct demangle_component *ret;
d00edca5
DD
2100 int can_subst;
2101
2102 /* The ABI specifies that when CV-qualifiers are used, the base type
2103 is substitutable, and the fully qualified type is substitutable,
2104 but the base type with a strict subset of the CV-qualifiers is
2105 not substitutable. The natural recursive implementation of the
2106 CV-qualifiers would cause subsets to be substitutable, so instead
2107 we pull them all off now.
2108
331c3da2
DD
2109 FIXME: The ABI says that order-insensitive vendor qualifiers
2110 should be handled in the same way, but we have no way to tell
2111 which vendor qualifiers are order-insensitive and which are
2112 order-sensitive. So we just assume that they are all
2113 order-sensitive. g++ 3.4 supports only one vendor qualifier,
2114 __vector, and it treats it as order-sensitive when mangling
2115 names. */
d00edca5
DD
2116
2117 peek = d_peek_char (di);
2118 if (peek == 'r' || peek == 'V' || peek == 'K')
2119 {
59727473 2120 struct demangle_component **pret;
74bcd529 2121
858b45cf 2122 pret = d_cv_qualifiers (di, &ret, 0);
331c3da2
DD
2123 if (pret == NULL)
2124 return NULL;
59727473 2125 *pret = cplus_demangle_type (di);
8d301070 2126 if (! *pret || ! d_add_substitution (di, ret))
d00edca5
DD
2127 return NULL;
2128 return ret;
2129 }
eb383413 2130
d00edca5 2131 can_subst = 1;
eb383413 2132
74bcd529 2133 switch (peek)
eb383413 2134 {
d00edca5
DD
2135 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
2136 case 'h': case 'i': case 'j': case 'l': case 'm': case 'n':
2137 case 'o': case 's': case 't':
2138 case 'v': case 'w': case 'x': case 'y': case 'z':
59727473
DD
2139 ret = d_make_builtin_type (di,
2140 &cplus_demangle_builtin_types[peek - 'a']);
b6fb00c0 2141 di->expansion += ret->u.s_builtin.type->len;
d00edca5
DD
2142 can_subst = 0;
2143 d_advance (di, 1);
2144 break;
2145
2146 case 'u':
2147 d_advance (di, 1);
59727473
DD
2148 ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE,
2149 d_source_name (di), NULL);
d00edca5
DD
2150 break;
2151
2152 case 'F':
2153 ret = d_function_type (di);
eb383413
L
2154 break;
2155
d00edca5
DD
2156 case '0': case '1': case '2': case '3': case '4':
2157 case '5': case '6': case '7': case '8': case '9':
2158 case 'N':
eb383413 2159 case 'Z':
d00edca5 2160 ret = d_class_enum_type (di);
eb383413
L
2161 break;
2162
d00edca5
DD
2163 case 'A':
2164 ret = d_array_type (di);
2165 break;
2166
2167 case 'M':
2168 ret = d_pointer_to_member_type (di);
2169 break;
2170
2171 case 'T':
2172 ret = d_template_param (di);
2173 if (d_peek_char (di) == 'I')
03d5f569 2174 {
d00edca5
DD
2175 /* This is <template-template-param> <template-args>. The
2176 <template-template-param> part is a substitution
2177 candidate. */
2178 if (! d_add_substitution (di, ret))
2179 return NULL;
59727473
DD
2180 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2181 d_template_args (di));
03d5f569 2182 }
d00edca5
DD
2183 break;
2184
2185 case 'S':
2186 /* If this is a special substitution, then it is the start of
2187 <class-enum-type>. */
2188 {
2189 char peek_next;
74bcd529 2190
d00edca5
DD
2191 peek_next = d_peek_next_char (di);
2192 if (IS_DIGIT (peek_next)
2193 || peek_next == '_'
858b45cf 2194 || IS_UPPER (peek_next))
d00edca5 2195 {
97ceaf5b 2196 ret = d_substitution (di, 0);
d00edca5
DD
2197 /* The substituted name may have been a template name and
2198 may be followed by tepmlate args. */
2199 if (d_peek_char (di) == 'I')
59727473 2200 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
d00edca5
DD
2201 d_template_args (di));
2202 else
2203 can_subst = 0;
2204 }
2205 else
2206 {
2207 ret = d_class_enum_type (di);
2208 /* If the substitution was a complete type, then it is not
2209 a new substitution candidate. However, if the
2210 substitution was followed by template arguments, then
2211 the whole thing is a substitution candidate. */
59727473 2212 if (ret != NULL && ret->type == DEMANGLE_COMPONENT_SUB_STD)
d00edca5
DD
2213 can_subst = 0;
2214 }
2215 }
eb383413
L
2216 break;
2217
8969a67f
DD
2218 case 'O':
2219 d_advance (di, 1);
2220 ret = d_make_comp (di, DEMANGLE_COMPONENT_RVALUE_REFERENCE,
2221 cplus_demangle_type (di), NULL);
2222 break;
2223
d00edca5
DD
2224 case 'P':
2225 d_advance (di, 1);
59727473
DD
2226 ret = d_make_comp (di, DEMANGLE_COMPONENT_POINTER,
2227 cplus_demangle_type (di), NULL);
d00edca5 2228 break;
eb383413 2229
d00edca5
DD
2230 case 'R':
2231 d_advance (di, 1);
59727473 2232 ret = d_make_comp (di, DEMANGLE_COMPONENT_REFERENCE,
8969a67f 2233 cplus_demangle_type (di), NULL);
d00edca5 2234 break;
eb383413 2235
d00edca5
DD
2236 case 'C':
2237 d_advance (di, 1);
59727473
DD
2238 ret = d_make_comp (di, DEMANGLE_COMPONENT_COMPLEX,
2239 cplus_demangle_type (di), NULL);
d00edca5
DD
2240 break;
2241
2242 case 'G':
2243 d_advance (di, 1);
59727473
DD
2244 ret = d_make_comp (di, DEMANGLE_COMPONENT_IMAGINARY,
2245 cplus_demangle_type (di), NULL);
d00edca5 2246 break;
eb383413 2247
d00edca5
DD
2248 case 'U':
2249 d_advance (di, 1);
2250 ret = d_source_name (di);
59727473
DD
2251 ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL,
2252 cplus_demangle_type (di), ret);
eb383413 2253 break;
d00edca5 2254
ba8cb4ba
DD
2255 case 'D':
2256 can_subst = 0;
2257 d_advance (di, 1);
2258 peek = d_next_char (di);
2259 switch (peek)
2260 {
2261 case 'T':
2262 case 't':
2263 /* decltype (expression) */
2264 ret = d_make_comp (di, DEMANGLE_COMPONENT_DECLTYPE,
2265 d_expression (di), NULL);
2266 if (ret && d_next_char (di) != 'E')
2267 ret = NULL;
eb7b5ddb 2268 can_subst = 1;
ba8cb4ba
DD
2269 break;
2270
2271 case 'p':
2272 /* Pack expansion. */
1c08f2c8
DD
2273 ret = d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION,
2274 cplus_demangle_type (di), NULL);
eb7b5ddb 2275 can_subst = 1;
1c08f2c8 2276 break;
24e829d0
DD
2277
2278 case 'a':
2279 /* auto */
2280 ret = d_make_name (di, "auto", 4);
2281 break;
ba8cb4ba
DD
2282
2283 case 'f':
1c08f2c8
DD
2284 /* 32-bit decimal floating point */
2285 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[26]);
ba8cb4ba
DD
2286 di->expansion += ret->u.s_builtin.type->len;
2287 break;
2288 case 'd':
1c08f2c8
DD
2289 /* 64-bit DFP */
2290 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[27]);
ba8cb4ba
DD
2291 di->expansion += ret->u.s_builtin.type->len;
2292 break;
2293 case 'e':
2294 /* 128-bit DFP */
1c08f2c8 2295 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[28]);
ba8cb4ba
DD
2296 di->expansion += ret->u.s_builtin.type->len;
2297 break;
2298 case 'h':
2299 /* 16-bit half-precision FP */
1c08f2c8
DD
2300 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[29]);
2301 di->expansion += ret->u.s_builtin.type->len;
2302 break;
2303 case 's':
2304 /* char16_t */
2305 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[30]);
2306 di->expansion += ret->u.s_builtin.type->len;
2307 break;
2308 case 'i':
2309 /* char32_t */
2310 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[31]);
ba8cb4ba
DD
2311 di->expansion += ret->u.s_builtin.type->len;
2312 break;
d2825c1a
DD
2313
2314 case 'F':
2315 /* Fixed point types. DF<int bits><length><fract bits><sat> */
2316 ret = d_make_empty (di);
2317 ret->type = DEMANGLE_COMPONENT_FIXED_TYPE;
2318 if ((ret->u.s_fixed.accum = IS_DIGIT (d_peek_char (di))))
2319 /* For demangling we don't care about the bits. */
2320 d_number (di);
2321 ret->u.s_fixed.length = cplus_demangle_type (di);
cbc43128
DD
2322 if (ret->u.s_fixed.length == NULL)
2323 return NULL;
d2825c1a
DD
2324 d_number (di);
2325 peek = d_next_char (di);
2326 ret->u.s_fixed.sat = (peek == 's');
2327 break;
60cf58f5 2328
cbc43128
DD
2329 case 'v':
2330 ret = d_vector_type (di);
eb7b5ddb 2331 can_subst = 1;
cbc43128
DD
2332 break;
2333
cf383746
DD
2334 case 'n':
2335 /* decltype(nullptr) */
2336 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[32]);
2337 di->expansion += ret->u.s_builtin.type->len;
2338 break;
2339
60cf58f5
DD
2340 default:
2341 return NULL;
ba8cb4ba
DD
2342 }
2343 break;
2344
d00edca5
DD
2345 default:
2346 return NULL;
eb383413
L
2347 }
2348
d00edca5
DD
2349 if (can_subst)
2350 {
2351 if (! d_add_substitution (di, ret))
2352 return NULL;
2353 }
eb383413 2354
d00edca5
DD
2355 return ret;
2356}
eb383413 2357
d00edca5 2358/* <CV-qualifiers> ::= [r] [V] [K] */
eb383413 2359
59727473 2360static struct demangle_component **
9334f9c6
DD
2361d_cv_qualifiers (struct d_info *di,
2362 struct demangle_component **pret, int member_fn)
eb383413 2363{
f9fb0b2d 2364 struct demangle_component **pstart;
eb383413
L
2365 char peek;
2366
f9fb0b2d 2367 pstart = pret;
d00edca5
DD
2368 peek = d_peek_char (di);
2369 while (peek == 'r' || peek == 'V' || peek == 'K')
eb383413 2370 {
59727473 2371 enum demangle_component_type t;
59666b35 2372
d00edca5
DD
2373 d_advance (di, 1);
2374 if (peek == 'r')
b6fb00c0 2375 {
59727473
DD
2376 t = (member_fn
2377 ? DEMANGLE_COMPONENT_RESTRICT_THIS
2378 : DEMANGLE_COMPONENT_RESTRICT);
b6fb00c0
DD
2379 di->expansion += sizeof "restrict";
2380 }
d00edca5 2381 else if (peek == 'V')
b6fb00c0 2382 {
59727473
DD
2383 t = (member_fn
2384 ? DEMANGLE_COMPONENT_VOLATILE_THIS
2385 : DEMANGLE_COMPONENT_VOLATILE);
b6fb00c0
DD
2386 di->expansion += sizeof "volatile";
2387 }
d00edca5 2388 else
b6fb00c0 2389 {
59727473
DD
2390 t = (member_fn
2391 ? DEMANGLE_COMPONENT_CONST_THIS
2392 : DEMANGLE_COMPONENT_CONST);
b6fb00c0
DD
2393 di->expansion += sizeof "const";
2394 }
eb383413 2395
d00edca5
DD
2396 *pret = d_make_comp (di, t, NULL, NULL);
2397 if (*pret == NULL)
2398 return NULL;
2399 pret = &d_left (*pret);
eb383413 2400
d00edca5
DD
2401 peek = d_peek_char (di);
2402 }
eb383413 2403
f9fb0b2d
DD
2404 if (!member_fn && peek == 'F')
2405 {
2406 while (pstart != pret)
2407 {
2408 switch ((*pstart)->type)
2409 {
2410 case DEMANGLE_COMPONENT_RESTRICT:
2411 (*pstart)->type = DEMANGLE_COMPONENT_RESTRICT_THIS;
2412 break;
2413 case DEMANGLE_COMPONENT_VOLATILE:
2414 (*pstart)->type = DEMANGLE_COMPONENT_VOLATILE_THIS;
2415 break;
2416 case DEMANGLE_COMPONENT_CONST:
2417 (*pstart)->type = DEMANGLE_COMPONENT_CONST_THIS;
2418 break;
2419 default:
2420 break;
2421 }
2422 pstart = &d_left (*pstart);
2423 }
2424 }
2425
d00edca5
DD
2426 return pret;
2427}
eb383413 2428
d00edca5 2429/* <function-type> ::= F [Y] <bare-function-type> E */
eb383413 2430
59727473 2431static struct demangle_component *
9334f9c6 2432d_function_type (struct d_info *di)
eb383413 2433{
59727473 2434 struct demangle_component *ret;
eb383413 2435
6ef6358e 2436 if (! d_check_char (di, 'F'))
d00edca5
DD
2437 return NULL;
2438 if (d_peek_char (di) == 'Y')
2439 {
2440 /* Function has C linkage. We don't print this information.
2441 FIXME: We should print it in verbose mode. */
2442 d_advance (di, 1);
2443 }
2444 ret = d_bare_function_type (di, 1);
6ef6358e 2445 if (! d_check_char (di, 'E'))
d00edca5
DD
2446 return NULL;
2447 return ret;
2448}
74bcd529 2449
664aa91f 2450/* <type>+ */
eb383413 2451
59727473 2452static struct demangle_component *
664aa91f 2453d_parmlist (struct d_info *di)
d00edca5 2454{
59727473
DD
2455 struct demangle_component *tl;
2456 struct demangle_component **ptl;
7887b2ce 2457
d00edca5
DD
2458 tl = NULL;
2459 ptl = &tl;
eb383413
L
2460 while (1)
2461 {
59727473 2462 struct demangle_component *type;
eb383413 2463
664aa91f 2464 char peek = d_peek_char (di);
7955ede5 2465 if (peek == '\0' || peek == 'E' || peek == '.')
d00edca5 2466 break;
59727473 2467 type = cplus_demangle_type (di);
d00edca5
DD
2468 if (type == NULL)
2469 return NULL;
664aa91f
DD
2470 *ptl = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, type, NULL);
2471 if (*ptl == NULL)
2472 return NULL;
2473 ptl = &d_right (*ptl);
eb383413 2474 }
eb383413 2475
d00edca5
DD
2476 /* There should be at least one parameter type besides the optional
2477 return type. A function which takes no arguments will have a
2478 single parameter type void. */
2479 if (tl == NULL)
2480 return NULL;
eb383413 2481
d00edca5
DD
2482 /* If we have a single parameter type void, omit it. */
2483 if (d_right (tl) == NULL
59727473 2484 && d_left (tl)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
d00edca5 2485 && d_left (tl)->u.s_builtin.type->print == D_PRINT_VOID)
b6fb00c0
DD
2486 {
2487 di->expansion -= d_left (tl)->u.s_builtin.type->len;
664aa91f 2488 d_left (tl) = NULL;
b6fb00c0 2489 }
eb383413 2490
664aa91f
DD
2491 return tl;
2492}
2493
2494/* <bare-function-type> ::= [J]<type>+ */
2495
2496static struct demangle_component *
2497d_bare_function_type (struct d_info *di, int has_return_type)
2498{
2499 struct demangle_component *return_type;
2500 struct demangle_component *tl;
2501 char peek;
2502
2503 /* Detect special qualifier indicating that the first argument
2504 is the return type. */
2505 peek = d_peek_char (di);
2506 if (peek == 'J')
2507 {
2508 d_advance (di, 1);
2509 has_return_type = 1;
2510 }
2511
2512 if (has_return_type)
2513 {
2514 return_type = cplus_demangle_type (di);
2515 if (return_type == NULL)
2516 return NULL;
2517 }
2518 else
2519 return_type = NULL;
2520
2521 tl = d_parmlist (di);
2522 if (tl == NULL)
2523 return NULL;
2524
2525 return d_make_comp (di, DEMANGLE_COMPONENT_FUNCTION_TYPE,
2526 return_type, tl);
d00edca5 2527}
eb383413 2528
d00edca5 2529/* <class-enum-type> ::= <name> */
eb383413 2530
59727473 2531static struct demangle_component *
9334f9c6 2532d_class_enum_type (struct d_info *di)
d00edca5
DD
2533{
2534 return d_name (di);
2535}
74bcd529 2536
d00edca5
DD
2537/* <array-type> ::= A <(positive dimension) number> _ <(element) type>
2538 ::= A [<(dimension) expression>] _ <(element) type>
2539*/
74bcd529 2540
59727473 2541static struct demangle_component *
9334f9c6 2542d_array_type (struct d_info *di)
d00edca5
DD
2543{
2544 char peek;
59727473 2545 struct demangle_component *dim;
74bcd529 2546
6ef6358e 2547 if (! d_check_char (di, 'A'))
d00edca5
DD
2548 return NULL;
2549
2550 peek = d_peek_char (di);
2551 if (peek == '_')
2552 dim = NULL;
2553 else if (IS_DIGIT (peek))
74bcd529 2554 {
d00edca5 2555 const char *s;
74bcd529 2556
d00edca5
DD
2557 s = d_str (di);
2558 do
2559 {
2560 d_advance (di, 1);
2561 peek = d_peek_char (di);
2562 }
2563 while (IS_DIGIT (peek));
2564 dim = d_make_name (di, s, d_str (di) - s);
331c3da2
DD
2565 if (dim == NULL)
2566 return NULL;
74bcd529 2567 }
eb383413 2568 else
d00edca5
DD
2569 {
2570 dim = d_expression (di);
2571 if (dim == NULL)
2572 return NULL;
2573 }
eb383413 2574
6ef6358e 2575 if (! d_check_char (di, '_'))
d00edca5 2576 return NULL;
eb383413 2577
59727473
DD
2578 return d_make_comp (di, DEMANGLE_COMPONENT_ARRAY_TYPE, dim,
2579 cplus_demangle_type (di));
d00edca5 2580}
eb383413 2581
cbc43128
DD
2582/* <vector-type> ::= Dv <number> _ <type>
2583 ::= Dv _ <expression> _ <type> */
2584
2585static struct demangle_component *
2586d_vector_type (struct d_info *di)
2587{
2588 char peek;
2589 struct demangle_component *dim;
2590
2591 peek = d_peek_char (di);
2592 if (peek == '_')
2593 {
2594 d_advance (di, 1);
2595 dim = d_expression (di);
2596 }
2597 else
2598 dim = d_number_component (di);
2599
2600 if (dim == NULL)
2601 return NULL;
2602
2603 if (! d_check_char (di, '_'))
2604 return NULL;
2605
2606 return d_make_comp (di, DEMANGLE_COMPONENT_VECTOR_TYPE, dim,
2607 cplus_demangle_type (di));
2608}
2609
d00edca5 2610/* <pointer-to-member-type> ::= M <(class) type> <(member) type> */
eb383413 2611
59727473 2612static struct demangle_component *
9334f9c6 2613d_pointer_to_member_type (struct d_info *di)
eb383413 2614{
59727473
DD
2615 struct demangle_component *cl;
2616 struct demangle_component *mem;
2617 struct demangle_component **pmem;
eb383413 2618
6ef6358e 2619 if (! d_check_char (di, 'M'))
d00edca5 2620 return NULL;
eb383413 2621
59727473 2622 cl = cplus_demangle_type (di);
eb383413 2623
d00edca5
DD
2624 /* The ABI specifies that any type can be a substitution source, and
2625 that M is followed by two types, and that when a CV-qualified
2626 type is seen both the base type and the CV-qualified types are
2627 substitution sources. The ABI also specifies that for a pointer
2628 to a CV-qualified member function, the qualifiers are attached to
2629 the second type. Given the grammar, a plain reading of the ABI
2630 suggests that both the CV-qualified member function and the
2631 non-qualified member function are substitution sources. However,
2632 g++ does not work that way. g++ treats only the CV-qualified
2633 member function as a substitution source. FIXME. So to work
2634 with g++, we need to pull off the CV-qualifiers here, in order to
cb6c09ac
DD
2635 avoid calling add_substitution() in cplus_demangle_type(). But
2636 for a CV-qualified member which is not a function, g++ does
2637 follow the ABI, so we need to handle that case here by calling
2638 d_add_substitution ourselves. */
eb383413 2639
858b45cf 2640 pmem = d_cv_qualifiers (di, &mem, 1);
331c3da2
DD
2641 if (pmem == NULL)
2642 return NULL;
59727473 2643 *pmem = cplus_demangle_type (di);
8d301070
GK
2644 if (*pmem == NULL)
2645 return NULL;
eb383413 2646
cb6c09ac
DD
2647 if (pmem != &mem && (*pmem)->type != DEMANGLE_COMPONENT_FUNCTION_TYPE)
2648 {
2649 if (! d_add_substitution (di, mem))
2650 return NULL;
2651 }
2652
59727473 2653 return d_make_comp (di, DEMANGLE_COMPONENT_PTRMEM_TYPE, cl, mem);
eb383413
L
2654}
2655
664aa91f
DD
2656/* <non-negative number> _ */
2657
2658static long
2659d_compact_number (struct d_info *di)
2660{
2661 long num;
2662 if (d_peek_char (di) == '_')
2663 num = 0;
2664 else if (d_peek_char (di) == 'n')
2665 return -1;
2666 else
2667 num = d_number (di) + 1;
2668
2669 if (! d_check_char (di, '_'))
2670 return -1;
2671 return num;
2672}
2673
d00edca5
DD
2674/* <template-param> ::= T_
2675 ::= T <(parameter-2 non-negative) number> _
2676*/
eb383413 2677
59727473 2678static struct demangle_component *
9334f9c6 2679d_template_param (struct d_info *di)
eb383413 2680{
d00edca5 2681 long param;
eb383413 2682
6ef6358e 2683 if (! d_check_char (di, 'T'))
d00edca5 2684 return NULL;
eb383413 2685
664aa91f
DD
2686 param = d_compact_number (di);
2687 if (param < 0)
d00edca5 2688 return NULL;
eb383413 2689
b6fb00c0
DD
2690 ++di->did_subs;
2691
d00edca5 2692 return d_make_template_param (di, param);
eb383413
L
2693}
2694
d00edca5
DD
2695/* <template-args> ::= I <template-arg>+ E */
2696
59727473 2697static struct demangle_component *
9334f9c6 2698d_template_args (struct d_info *di)
eb383413 2699{
59727473
DD
2700 struct demangle_component *hold_last_name;
2701 struct demangle_component *al;
2702 struct demangle_component **pal;
eb383413 2703
d00edca5
DD
2704 /* Preserve the last name we saw--don't let the template arguments
2705 clobber it, as that would give us the wrong name for a subsequent
2706 constructor or destructor. */
2707 hold_last_name = di->last_name;
eb383413 2708
eb7b5ddb
DD
2709 if (d_peek_char (di) != 'I'
2710 && d_peek_char (di) != 'J')
d00edca5 2711 return NULL;
eb7b5ddb 2712 d_advance (di, 1);
eb383413 2713
1c08f2c8
DD
2714 if (d_peek_char (di) == 'E')
2715 {
2716 /* An argument pack can be empty. */
2717 d_advance (di, 1);
2718 return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, NULL, NULL);
2719 }
2720
d00edca5
DD
2721 al = NULL;
2722 pal = &al;
eb383413
L
2723 while (1)
2724 {
59727473 2725 struct demangle_component *a;
d00edca5
DD
2726
2727 a = d_template_arg (di);
2728 if (a == NULL)
2729 return NULL;
2730
59727473 2731 *pal = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, a, NULL);
331c3da2
DD
2732 if (*pal == NULL)
2733 return NULL;
d00edca5
DD
2734 pal = &d_right (*pal);
2735
2736 if (d_peek_char (di) == 'E')
03d5f569 2737 {
d00edca5
DD
2738 d_advance (di, 1);
2739 break;
03d5f569 2740 }
eb383413
L
2741 }
2742
d00edca5
DD
2743 di->last_name = hold_last_name;
2744
2745 return al;
eb383413
L
2746}
2747
d00edca5
DD
2748/* <template-arg> ::= <type>
2749 ::= X <expression> E
2750 ::= <expr-primary>
2751*/
eb383413 2752
59727473 2753static struct demangle_component *
9334f9c6 2754d_template_arg (struct d_info *di)
eb383413 2755{
59727473 2756 struct demangle_component *ret;
03d5f569 2757
d00edca5 2758 switch (d_peek_char (di))
eb383413 2759 {
d00edca5
DD
2760 case 'X':
2761 d_advance (di, 1);
2762 ret = d_expression (di);
6ef6358e 2763 if (! d_check_char (di, 'E'))
d00edca5
DD
2764 return NULL;
2765 return ret;
b851d07b 2766
d00edca5
DD
2767 case 'L':
2768 return d_expr_primary (di);
eb383413 2769
1c08f2c8 2770 case 'I':
eb7b5ddb 2771 case 'J':
1c08f2c8
DD
2772 /* An argument pack. */
2773 return d_template_args (di);
2774
d00edca5 2775 default:
59727473 2776 return cplus_demangle_type (di);
74bcd529 2777 }
eb383413
L
2778}
2779
eb7b5ddb
DD
2780/* Parse a sequence of expressions until we hit the terminator
2781 character. */
ba8cb4ba
DD
2782
2783static struct demangle_component *
eb7b5ddb 2784d_exprlist (struct d_info *di, char terminator)
ba8cb4ba
DD
2785{
2786 struct demangle_component *list = NULL;
2787 struct demangle_component **p = &list;
2788
eb7b5ddb 2789 if (d_peek_char (di) == terminator)
1c08f2c8
DD
2790 {
2791 d_advance (di, 1);
2792 return d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, NULL, NULL);
2793 }
2794
ba8cb4ba
DD
2795 while (1)
2796 {
2797 struct demangle_component *arg = d_expression (di);
2798 if (arg == NULL)
2799 return NULL;
2800
2801 *p = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, arg, NULL);
2802 if (*p == NULL)
2803 return NULL;
2804 p = &d_right (*p);
2805
eb7b5ddb 2806 if (d_peek_char (di) == terminator)
ba8cb4ba
DD
2807 {
2808 d_advance (di, 1);
2809 break;
2810 }
2811 }
2812
2813 return list;
2814}
2815
7c328963
DD
2816/* Returns nonzero iff OP is an operator for a C++ cast: const_cast,
2817 dynamic_cast, static_cast or reinterpret_cast. */
2818
2819static int
2820op_is_new_cast (struct demangle_component *op)
2821{
2822 const char *code = op->u.s_operator.op->code;
2823 return (code[1] == 'c'
2824 && (code[0] == 's' || code[0] == 'd'
2825 || code[0] == 'c' || code[0] == 'r'));
2826}
2827
d00edca5
DD
2828/* <expression> ::= <(unary) operator-name> <expression>
2829 ::= <(binary) operator-name> <expression> <expression>
2830 ::= <(trinary) operator-name> <expression> <expression> <expression>
ba8cb4ba 2831 ::= cl <expression>+ E
d00edca5
DD
2832 ::= st <type>
2833 ::= <template-param>
2834 ::= sr <type> <unqualified-name>
2835 ::= sr <type> <unqualified-name> <template-args>
2836 ::= <expr-primary>
2837*/
2838
59727473 2839static struct demangle_component *
9334f9c6 2840d_expression (struct d_info *di)
eb383413 2841{
d00edca5 2842 char peek;
eb383413 2843
d00edca5
DD
2844 peek = d_peek_char (di);
2845 if (peek == 'L')
2846 return d_expr_primary (di);
2847 else if (peek == 'T')
2848 return d_template_param (di);
2849 else if (peek == 's' && d_peek_next_char (di) == 'r')
eb383413 2850 {
59727473
DD
2851 struct demangle_component *type;
2852 struct demangle_component *name;
eb383413 2853
d00edca5 2854 d_advance (di, 2);
59727473 2855 type = cplus_demangle_type (di);
d00edca5
DD
2856 name = d_unqualified_name (di);
2857 if (d_peek_char (di) != 'I')
59727473 2858 return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type, name);
d00edca5 2859 else
59727473
DD
2860 return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type,
2861 d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
d00edca5 2862 d_template_args (di)));
793011ca 2863 }
e2e1864d
DD
2864 else if (peek == 's' && d_peek_next_char (di) == 'p')
2865 {
2866 d_advance (di, 2);
2867 return d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION,
2868 d_expression (di), NULL);
2869 }
c743cf5d 2870 else if (peek == 'f' && d_peek_next_char (di) == 'p')
ba8cb4ba 2871 {
c743cf5d
DD
2872 /* Function parameter used in a late-specified return type. */
2873 int index;
ba8cb4ba 2874 d_advance (di, 2);
f2917a30
DD
2875 if (d_peek_char (di) == 'T')
2876 {
2877 /* 'this' parameter. */
2878 d_advance (di, 1);
2879 index = 0;
2880 }
2881 else
2882 {
2883 index = d_compact_number (di) + 1;
2884 if (index == 0)
2885 return NULL;
2886 }
c743cf5d 2887 return d_make_function_param (di, index);
ba8cb4ba 2888 }
cbc43128
DD
2889 else if (IS_DIGIT (peek)
2890 || (peek == 'o' && d_peek_next_char (di) == 'n'))
1c08f2c8
DD
2891 {
2892 /* We can get an unqualified name as an expression in the case of
cbc43128
DD
2893 a dependent function call, i.e. decltype(f(t)). */
2894 struct demangle_component *name;
2895
2896 if (peek == 'o')
2897 /* operator-function-id, i.e. operator+(t). */
2898 d_advance (di, 2);
2899
2900 name = d_unqualified_name (di);
1c08f2c8
DD
2901 if (name == NULL)
2902 return NULL;
2903 if (d_peek_char (di) == 'I')
2904 return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
2905 d_template_args (di));
2906 else
2907 return name;
2908 }
eb7b5ddb
DD
2909 else if ((peek == 'i' || peek == 't')
2910 && d_peek_next_char (di) == 'l')
2911 {
2912 /* Brace-enclosed initializer list, untyped or typed. */
2913 struct demangle_component *type = NULL;
2914 if (peek == 't')
2915 type = cplus_demangle_type (di);
2916 d_advance (di, 2);
2917 return d_make_comp (di, DEMANGLE_COMPONENT_INITIALIZER_LIST,
2918 type, d_exprlist (di, 'E'));
2919 }
d00edca5 2920 else
eb383413 2921 {
59727473 2922 struct demangle_component *op;
eb7b5ddb 2923 const char *code = NULL;
d00edca5 2924 int args;
eb383413 2925
d00edca5
DD
2926 op = d_operator_name (di);
2927 if (op == NULL)
2928 return NULL;
eb383413 2929
59727473 2930 if (op->type == DEMANGLE_COMPONENT_OPERATOR)
eb7b5ddb
DD
2931 {
2932 code = op->u.s_operator.op->code;
2933 di->expansion += op->u.s_operator.op->len - 2;
2934 if (strcmp (code, "st") == 0)
2935 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
2936 cplus_demangle_type (di));
2937 }
eb383413 2938
d00edca5
DD
2939 switch (op->type)
2940 {
2941 default:
2942 return NULL;
59727473 2943 case DEMANGLE_COMPONENT_OPERATOR:
d00edca5
DD
2944 args = op->u.s_operator.op->args;
2945 break;
59727473 2946 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
d00edca5
DD
2947 args = op->u.s_extended_operator.args;
2948 break;
59727473 2949 case DEMANGLE_COMPONENT_CAST:
60cf58f5 2950 args = 1;
d00edca5
DD
2951 break;
2952 }
2953
2954 switch (args)
2955 {
eb7b5ddb
DD
2956 case 0:
2957 return d_make_comp (di, DEMANGLE_COMPONENT_NULLARY, op, NULL);
2958
d00edca5 2959 case 1:
c743cf5d
DD
2960 {
2961 struct demangle_component *operand;
eb7b5ddb
DD
2962 int suffix = 0;
2963
2964 if (code && (code[0] == 'p' || code[0] == 'm')
2965 && code[1] == code[0])
2966 /* pp_ and mm_ are the prefix variants. */
2967 suffix = !d_check_char (di, '_');
2968
c743cf5d
DD
2969 if (op->type == DEMANGLE_COMPONENT_CAST
2970 && d_check_char (di, '_'))
eb7b5ddb 2971 operand = d_exprlist (di, 'E');
c743cf5d
DD
2972 else
2973 operand = d_expression (di);
eb7b5ddb
DD
2974
2975 if (suffix)
2976 /* Indicate the suffix variant for d_print_comp. */
2977 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
2978 d_make_comp (di,
2979 DEMANGLE_COMPONENT_BINARY_ARGS,
2980 operand, operand));
2981 else
2982 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
2983 operand);
c743cf5d 2984 }
d00edca5
DD
2985 case 2:
2986 {
59727473 2987 struct demangle_component *left;
ba8cb4ba 2988 struct demangle_component *right;
d00edca5 2989
7c328963
DD
2990 if (op_is_new_cast (op))
2991 left = cplus_demangle_type (di);
2992 else
2993 left = d_expression (di);
cbc43128 2994 if (!strcmp (code, "cl"))
eb7b5ddb 2995 right = d_exprlist (di, 'E');
cbc43128
DD
2996 else if (!strcmp (code, "dt") || !strcmp (code, "pt"))
2997 {
2998 right = d_unqualified_name (di);
2999 if (d_peek_char (di) == 'I')
3000 right = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE,
3001 right, d_template_args (di));
3002 }
ba8cb4ba
DD
3003 else
3004 right = d_expression (di);
3005
59727473
DD
3006 return d_make_comp (di, DEMANGLE_COMPONENT_BINARY, op,
3007 d_make_comp (di,
3008 DEMANGLE_COMPONENT_BINARY_ARGS,
ba8cb4ba 3009 left, right));
d00edca5
DD
3010 }
3011 case 3:
3012 {
59727473
DD
3013 struct demangle_component *first;
3014 struct demangle_component *second;
eb7b5ddb 3015 struct demangle_component *third;
d00edca5 3016
eb7b5ddb
DD
3017 if (!strcmp (code, "qu"))
3018 {
3019 /* ?: expression. */
3020 first = d_expression (di);
3021 second = d_expression (di);
3022 third = d_expression (di);
3023 }
3024 else if (code[0] == 'n')
3025 {
3026 /* new-expression. */
3027 if (code[1] != 'w' && code[1] != 'a')
3028 return NULL;
3029 first = d_exprlist (di, '_');
3030 second = cplus_demangle_type (di);
3031 if (d_peek_char (di) == 'E')
3032 {
3033 d_advance (di, 1);
3034 third = NULL;
3035 }
3036 else if (d_peek_char (di) == 'p'
3037 && d_peek_next_char (di) == 'i')
3038 {
3039 /* Parenthesized initializer. */
3040 d_advance (di, 2);
3041 third = d_exprlist (di, 'E');
3042 }
3043 else if (d_peek_char (di) == 'i'
3044 && d_peek_next_char (di) == 'l')
3045 /* initializer-list. */
3046 third = d_expression (di);
3047 else
3048 return NULL;
3049 }
3050 else
3051 return NULL;
59727473
DD
3052 return d_make_comp (di, DEMANGLE_COMPONENT_TRINARY, op,
3053 d_make_comp (di,
3054 DEMANGLE_COMPONENT_TRINARY_ARG1,
3055 first,
d00edca5 3056 d_make_comp (di,
59727473 3057 DEMANGLE_COMPONENT_TRINARY_ARG2,
eb7b5ddb 3058 second, third)));
d00edca5
DD
3059 }
3060 default:
3061 return NULL;
3062 }
eb383413
L
3063 }
3064}
3065
d00edca5
DD
3066/* <expr-primary> ::= L <type> <(value) number> E
3067 ::= L <type> <(value) float> E
3068 ::= L <mangled-name> E
3069*/
74bcd529 3070
59727473 3071static struct demangle_component *
9334f9c6 3072d_expr_primary (struct d_info *di)
74bcd529 3073{
59727473 3074 struct demangle_component *ret;
74bcd529 3075
6ef6358e 3076 if (! d_check_char (di, 'L'))
d00edca5 3077 return NULL;
c743cf5d
DD
3078 if (d_peek_char (di) == '_'
3079 /* Workaround for G++ bug; see comment in write_template_arg. */
3080 || d_peek_char (di) == 'Z')
59727473 3081 ret = cplus_demangle_mangled_name (di, 0);
d00edca5 3082 else
74bcd529 3083 {
59727473
DD
3084 struct demangle_component *type;
3085 enum demangle_component_type t;
d00edca5
DD
3086 const char *s;
3087
59727473 3088 type = cplus_demangle_type (di);
a21da8bf
DD
3089 if (type == NULL)
3090 return NULL;
d00edca5 3091
b6fb00c0
DD
3092 /* If we have a type we know how to print, we aren't going to
3093 print the type name itself. */
59727473 3094 if (type->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
b6fb00c0
DD
3095 && type->u.s_builtin.type->print != D_PRINT_DEFAULT)
3096 di->expansion -= type->u.s_builtin.type->len;
3097
d00edca5
DD
3098 /* Rather than try to interpret the literal value, we just
3099 collect it as a string. Note that it's possible to have a
3100 floating point literal here. The ABI specifies that the
3101 format of such literals is machine independent. That's fine,
3102 but what's not fine is that versions of g++ up to 3.2 with
3103 -fabi-version=1 used upper case letters in the hex constant,
3104 and dumped out gcc's internal representation. That makes it
3105 hard to tell where the constant ends, and hard to dump the
3106 constant in any readable form anyhow. We don't attempt to
3107 handle these cases. */
3108
59727473 3109 t = DEMANGLE_COMPONENT_LITERAL;
97ceaf5b
DD
3110 if (d_peek_char (di) == 'n')
3111 {
59727473 3112 t = DEMANGLE_COMPONENT_LITERAL_NEG;
97ceaf5b
DD
3113 d_advance (di, 1);
3114 }
d00edca5
DD
3115 s = d_str (di);
3116 while (d_peek_char (di) != 'E')
6ba85b8c
DD
3117 {
3118 if (d_peek_char (di) == '\0')
3119 return NULL;
3120 d_advance (di, 1);
3121 }
97ceaf5b 3122 ret = d_make_comp (di, t, type, d_make_name (di, s, d_str (di) - s));
d00edca5 3123 }
6ef6358e 3124 if (! d_check_char (di, 'E'))
d00edca5
DD
3125 return NULL;
3126 return ret;
74bcd529
DD
3127}
3128
d00edca5
DD
3129/* <local-name> ::= Z <(function) encoding> E <(entity) name> [<discriminator>]
3130 ::= Z <(function) encoding> E s [<discriminator>]
3131*/
74bcd529 3132
59727473 3133static struct demangle_component *
9334f9c6 3134d_local_name (struct d_info *di)
74bcd529 3135{
59727473 3136 struct demangle_component *function;
74bcd529 3137
6ef6358e 3138 if (! d_check_char (di, 'Z'))
d00edca5 3139 return NULL;
74bcd529 3140
6d95373e 3141 function = d_encoding (di, 0);
74bcd529 3142
6ef6358e 3143 if (! d_check_char (di, 'E'))
d00edca5 3144 return NULL;
74bcd529 3145
d00edca5 3146 if (d_peek_char (di) == 's')
74bcd529 3147 {
d00edca5
DD
3148 d_advance (di, 1);
3149 if (! d_discriminator (di))
3150 return NULL;
59727473 3151 return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function,
d00edca5
DD
3152 d_make_name (di, "string literal",
3153 sizeof "string literal" - 1));
74bcd529 3154 }
d00edca5 3155 else
74bcd529 3156 {
59727473 3157 struct demangle_component *name;
664aa91f
DD
3158 int num = -1;
3159
3160 if (d_peek_char (di) == 'd')
3161 {
3162 /* Default argument scope: d <number> _. */
3163 d_advance (di, 1);
3164 num = d_compact_number (di);
3165 if (num < 0)
3166 return NULL;
3167 }
74bcd529 3168
d00edca5 3169 name = d_name (di);
664aa91f
DD
3170 if (name)
3171 switch (name->type)
3172 {
3173 /* Lambdas and unnamed types have internal discriminators. */
3174 case DEMANGLE_COMPONENT_LAMBDA:
3175 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
3176 break;
3177 default:
3178 if (! d_discriminator (di))
3179 return NULL;
3180 }
3181 if (num >= 0)
3182 name = d_make_default_arg (di, num, name);
59727473 3183 return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function, name);
74bcd529 3184 }
74bcd529
DD
3185}
3186
d00edca5 3187/* <discriminator> ::= _ <(non-negative) number>
eb383413 3188
d00edca5
DD
3189 We demangle the discriminator, but we don't print it out. FIXME:
3190 We should print it out in verbose mode. */
74bcd529 3191
d00edca5 3192static int
9334f9c6 3193d_discriminator (struct d_info *di)
d00edca5
DD
3194{
3195 long discrim;
74bcd529 3196
d00edca5
DD
3197 if (d_peek_char (di) != '_')
3198 return 1;
3199 d_advance (di, 1);
3200 discrim = d_number (di);
3201 if (discrim < 0)
3202 return 0;
3203 return 1;
3204}
eb383413 3205
664aa91f
DD
3206/* <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _ */
3207
3208static struct demangle_component *
3209d_lambda (struct d_info *di)
3210{
3211 struct demangle_component *tl;
3212 struct demangle_component *ret;
3213 int num;
3214
3215 if (! d_check_char (di, 'U'))
3216 return NULL;
3217 if (! d_check_char (di, 'l'))
3218 return NULL;
3219
3220 tl = d_parmlist (di);
3221 if (tl == NULL)
3222 return NULL;
3223
3224 if (! d_check_char (di, 'E'))
3225 return NULL;
3226
3227 num = d_compact_number (di);
3228 if (num < 0)
3229 return NULL;
3230
3231 ret = d_make_empty (di);
3232 if (ret)
3233 {
3234 ret->type = DEMANGLE_COMPONENT_LAMBDA;
3235 ret->u.s_unary_num.sub = tl;
3236 ret->u.s_unary_num.num = num;
3237 }
3238
3239 if (! d_add_substitution (di, ret))
3240 return NULL;
3241
3242 return ret;
3243}
3244
3245/* <unnamed-type-name> ::= Ut [ <nonnegative number> ] _ */
3246
3247static struct demangle_component *
3248d_unnamed_type (struct d_info *di)
3249{
3250 struct demangle_component *ret;
3251 long num;
3252
3253 if (! d_check_char (di, 'U'))
3254 return NULL;
3255 if (! d_check_char (di, 't'))
3256 return NULL;
3257
3258 num = d_compact_number (di);
3259 if (num < 0)
3260 return NULL;
3261
3262 ret = d_make_empty (di);
3263 if (ret)
3264 {
3265 ret->type = DEMANGLE_COMPONENT_UNNAMED_TYPE;
3266 ret->u.s_number.number = num;
3267 }
3268
3269 if (! d_add_substitution (di, ret))
3270 return NULL;
3271
3272 return ret;
3273}
3274
7955ede5
DD
3275/* <clone-suffix> ::= [ . <clone-type-identifier> ] [ . <nonnegative number> ]*
3276*/
3277
3278static struct demangle_component *
3279d_clone_suffix (struct d_info *di, struct demangle_component *encoding)
3280{
3281 const char *suffix = d_str (di);
3282 const char *pend = suffix;
3283 struct demangle_component *n;
3284
3285 if (*pend == '.' && (IS_LOWER (pend[1]) || pend[1] == '_'))
3286 {
3287 pend += 2;
3288 while (IS_LOWER (*pend) || *pend == '_')
3289 ++pend;
3290 }
3291 while (*pend == '.' && IS_DIGIT (pend[1]))
3292 {
3293 pend += 2;
3294 while (IS_DIGIT (*pend))
3295 ++pend;
3296 }
3297 d_advance (di, pend - suffix);
3298 n = d_make_name (di, suffix, pend - suffix);
3299 return d_make_comp (di, DEMANGLE_COMPONENT_CLONE, encoding, n);
3300}
3301
d00edca5 3302/* Add a new substitution. */
eb383413 3303
d00edca5 3304static int
9334f9c6 3305d_add_substitution (struct d_info *di, struct demangle_component *dc)
eb383413 3306{
331c3da2
DD
3307 if (dc == NULL)
3308 return 0;
d00edca5
DD
3309 if (di->next_sub >= di->num_subs)
3310 return 0;
3311 di->subs[di->next_sub] = dc;
3312 ++di->next_sub;
3313 return 1;
3314}
3315
3316/* <substitution> ::= S <seq-id> _
3317 ::= S_
3318 ::= St
3319 ::= Sa
3320 ::= Sb
3321 ::= Ss
3322 ::= Si
3323 ::= So
3324 ::= Sd
97ceaf5b
DD
3325
3326 If PREFIX is non-zero, then this type is being used as a prefix in
3327 a qualified name. In this case, for the standard substitutions, we
3328 need to check whether we are being used as a prefix for a
3329 constructor or destructor, and return a full template name.
3330 Otherwise we will get something like std::iostream::~iostream()
3331 which does not correspond particularly well to any function which
3332 actually appears in the source.
d00edca5 3333*/
eb383413 3334
97ceaf5b
DD
3335static const struct d_standard_sub_info standard_subs[] =
3336{
b6fb00c0
DD
3337 { 't', NL ("std"),
3338 NL ("std"),
3339 NULL, 0 },
3340 { 'a', NL ("std::allocator"),
3341 NL ("std::allocator"),
3342 NL ("allocator") },
3343 { 'b', NL ("std::basic_string"),
3344 NL ("std::basic_string"),
3345 NL ("basic_string") },
3346 { 's', NL ("std::string"),
3347 NL ("std::basic_string<char, std::char_traits<char>, std::allocator<char> >"),
3348 NL ("basic_string") },
3349 { 'i', NL ("std::istream"),
3350 NL ("std::basic_istream<char, std::char_traits<char> >"),
3351 NL ("basic_istream") },
3352 { 'o', NL ("std::ostream"),
3353 NL ("std::basic_ostream<char, std::char_traits<char> >"),
3354 NL ("basic_ostream") },
3355 { 'd', NL ("std::iostream"),
3356 NL ("std::basic_iostream<char, std::char_traits<char> >"),
3357 NL ("basic_iostream") }
97ceaf5b
DD
3358};
3359
59727473 3360static struct demangle_component *
9334f9c6 3361d_substitution (struct d_info *di, int prefix)
d00edca5
DD
3362{
3363 char c;
eb383413 3364
6ef6358e 3365 if (! d_check_char (di, 'S'))
d00edca5 3366 return NULL;
e7e9b069 3367
d00edca5 3368 c = d_next_char (di);
858b45cf 3369 if (c == '_' || IS_DIGIT (c) || IS_UPPER (c))
eb383413 3370 {
dddc49b7 3371 unsigned int id;
eb383413 3372
d00edca5
DD
3373 id = 0;
3374 if (c != '_')
eb383413 3375 {
d00edca5 3376 do
eb383413 3377 {
dddc49b7
DD
3378 unsigned int new_id;
3379
d00edca5 3380 if (IS_DIGIT (c))
dddc49b7 3381 new_id = id * 36 + c - '0';
858b45cf 3382 else if (IS_UPPER (c))
dddc49b7 3383 new_id = id * 36 + c - 'A' + 10;
d00edca5
DD
3384 else
3385 return NULL;
dddc49b7 3386 if (new_id < id)
e63f184e 3387 return NULL;
dddc49b7 3388 id = new_id;
d00edca5 3389 c = d_next_char (di);
eb383413 3390 }
d00edca5 3391 while (c != '_');
eb383413 3392
d00edca5 3393 ++id;
eb383413 3394 }
eb383413 3395
dddc49b7 3396 if (id >= (unsigned int) di->next_sub)
d00edca5 3397 return NULL;
eb383413 3398
b6fb00c0
DD
3399 ++di->did_subs;
3400
d00edca5 3401 return di->subs[id];
eb383413 3402 }
d00edca5 3403 else
eb383413 3404 {
97ceaf5b
DD
3405 int verbose;
3406 const struct d_standard_sub_info *p;
3407 const struct d_standard_sub_info *pend;
3408
3409 verbose = (di->options & DMGL_VERBOSE) != 0;
3410 if (! verbose && prefix)
e61231f1 3411 {
97ceaf5b
DD
3412 char peek;
3413
3414 peek = d_peek_char (di);
3415 if (peek == 'C' || peek == 'D')
3416 verbose = 1;
eb383413 3417 }
97ceaf5b
DD
3418
3419 pend = (&standard_subs[0]
3420 + sizeof standard_subs / sizeof standard_subs[0]);
3421 for (p = &standard_subs[0]; p < pend; ++p)
3422 {
3423 if (c == p->code)
3424 {
b6fb00c0
DD
3425 const char *s;
3426 int len;
3427
97ceaf5b 3428 if (p->set_last_name != NULL)
b6fb00c0
DD
3429 di->last_name = d_make_sub (di, p->set_last_name,
3430 p->set_last_name_len);
97ceaf5b 3431 if (verbose)
b6fb00c0
DD
3432 {
3433 s = p->full_expansion;
3434 len = p->full_len;
3435 }
97ceaf5b 3436 else
b6fb00c0
DD
3437 {
3438 s = p->simple_expansion;
3439 len = p->simple_len;
3440 }
3441 di->expansion += len;
3442 return d_make_sub (di, s, len);
97ceaf5b
DD
3443 }
3444 }
3445
3446 return NULL;
eb383413 3447 }
eb383413
L
3448}
3449
208c1674 3450/* Initialize a growable string. */
eb383413 3451
d00edca5 3452static void
208c1674 3453d_growable_string_init (struct d_growable_string *dgs, size_t estimate)
d00edca5 3454{
208c1674
DD
3455 dgs->buf = NULL;
3456 dgs->len = 0;
3457 dgs->alc = 0;
3458 dgs->allocation_failure = 0;
eb383413 3459
208c1674
DD
3460 if (estimate > 0)
3461 d_growable_string_resize (dgs, estimate);
3462}
3463
3464/* Grow a growable string to a given size. */
3465
3466static inline void
3467d_growable_string_resize (struct d_growable_string *dgs, size_t need)
3468{
3469 size_t newalc;
3470 char *newbuf;
3471
3472 if (dgs->allocation_failure)
331c3da2 3473 return;
59666b35 3474
208c1674
DD
3475 /* Start allocation at two bytes to avoid any possibility of confusion
3476 with the special value of 1 used as a return in *palc to indicate
3477 allocation failures. */
3478 newalc = dgs->alc > 0 ? dgs->alc : 2;
3479 while (newalc < need)
3480 newalc <<= 1;
3481
3482 newbuf = (char *) realloc (dgs->buf, newalc);
3483 if (newbuf == NULL)
3484 {
3485 free (dgs->buf);
3486 dgs->buf = NULL;
3487 dgs->len = 0;
3488 dgs->alc = 0;
3489 dgs->allocation_failure = 1;
3490 return;
eb383413 3491 }
208c1674
DD
3492 dgs->buf = newbuf;
3493 dgs->alc = newalc;
d00edca5 3494}
0976f6a7 3495
208c1674 3496/* Append a buffer to a growable string. */
0976f6a7 3497
208c1674
DD
3498static inline void
3499d_growable_string_append_buffer (struct d_growable_string *dgs,
3500 const char *s, size_t l)
d00edca5 3501{
208c1674 3502 size_t need;
0976f6a7 3503
208c1674
DD
3504 need = dgs->len + l + 1;
3505 if (need > dgs->alc)
3506 d_growable_string_resize (dgs, need);
3507
3508 if (dgs->allocation_failure)
3509 return;
3510
3511 memcpy (dgs->buf + dgs->len, s, l);
3512 dgs->buf[dgs->len + l] = '\0';
3513 dgs->len += l;
eb383413
L
3514}
3515
208c1674 3516/* Bridge growable strings to the callback mechanism. */
d00edca5
DD
3517
3518static void
208c1674 3519d_growable_string_callback_adapter (const char *s, size_t l, void *opaque)
eb383413 3520{
208c1674 3521 struct d_growable_string *dgs = (struct d_growable_string*) opaque;
eb383413 3522
208c1674 3523 d_growable_string_append_buffer (dgs, s, l);
eb383413
L
3524}
3525
208c1674 3526/* Initialize a print information structure. */
eb383413 3527
d00edca5 3528static void
ddee5e46
DD
3529d_print_init (struct d_print_info *dpi, demangle_callbackref callback,
3530 void *opaque)
208c1674 3531{
208c1674
DD
3532 dpi->len = 0;
3533 dpi->last_char = '\0';
3534 dpi->templates = NULL;
3535 dpi->modifiers = NULL;
04aed652 3536 dpi->pack_index = 0;
3baae9d6 3537 dpi->flush_count = 0;
208c1674
DD
3538
3539 dpi->callback = callback;
3540 dpi->opaque = opaque;
3541
3542 dpi->demangle_failure = 0;
3543}
3544
3545/* Indicate that an error occurred during printing, and test for error. */
3546
3547static inline void
9334f9c6 3548d_print_error (struct d_print_info *dpi)
bc9bf259 3549{
208c1674
DD
3550 dpi->demangle_failure = 1;
3551}
3552
3553static inline int
3554d_print_saw_error (struct d_print_info *dpi)
3555{
3556 return dpi->demangle_failure != 0;
3557}
3558
3559/* Flush buffered characters to the callback. */
3560
3561static inline void
3562d_print_flush (struct d_print_info *dpi)
3563{
3564 dpi->buf[dpi->len] = '\0';
3565 dpi->callback (dpi->buf, dpi->len, dpi->opaque);
3566 dpi->len = 0;
3baae9d6 3567 dpi->flush_count++;
208c1674
DD
3568}
3569
3570/* Append characters and buffers for printing. */
3571
3572static inline void
3573d_append_char (struct d_print_info *dpi, char c)
3574{
3575 if (dpi->len == sizeof (dpi->buf) - 1)
3576 d_print_flush (dpi);
3577
3578 dpi->buf[dpi->len++] = c;
3579 dpi->last_char = c;
3580}
3581
3582static inline void
3583d_append_buffer (struct d_print_info *dpi, const char *s, size_t l)
3584{
3585 size_t i;
3586
3587 for (i = 0; i < l; i++)
3588 d_append_char (dpi, s[i]);
3589}
3590
3591static inline void
3592d_append_string (struct d_print_info *dpi, const char *s)
3593{
3594 d_append_buffer (dpi, s, strlen (s));
3595}
3596
664aa91f
DD
3597static inline void
3598d_append_num (struct d_print_info *dpi, long l)
3599{
3600 char buf[25];
3601 sprintf (buf,"%ld", l);
3602 d_append_string (dpi, buf);
3603}
3604
208c1674
DD
3605static inline char
3606d_last_char (struct d_print_info *dpi)
3607{
3608 return dpi->last_char;
3609}
3610
3611/* Turn components into a human readable string. OPTIONS is the
3612 options bits passed to the demangler. DC is the tree to print.
3613 CALLBACK is a function to call to flush demangled string segments
3614 as they fill the intermediate buffer, and OPAQUE is a generalized
3615 callback argument. On success, this returns 1. On failure,
3616 it returns 0, indicating a bad parse. It does not use heap
3617 memory to build an output string, so cannot encounter memory
3618 allocation failure. */
3619
3620CP_STATIC_IF_GLIBCPP_V3
3621int
3622cplus_demangle_print_callback (int options,
3623 const struct demangle_component *dc,
3624 demangle_callbackref callback, void *opaque)
3625{
3626 struct d_print_info dpi;
3627
ddee5e46 3628 d_print_init (&dpi, callback, opaque);
208c1674 3629
ddee5e46 3630 d_print_comp (&dpi, options, dc);
208c1674
DD
3631
3632 d_print_flush (&dpi);
3633
3634 return ! d_print_saw_error (&dpi);
d00edca5 3635}
bc9bf259 3636
b6fb00c0
DD
3637/* Turn components into a human readable string. OPTIONS is the
3638 options bits passed to the demangler. DC is the tree to print.
3639 ESTIMATE is a guess at the length of the result. This returns a
3640 string allocated by malloc, or NULL on error. On success, this
3641 sets *PALC to the size of the allocated buffer. On failure, this
3642 sets *PALC to 0 for a bad parse, or to 1 for a memory allocation
3643 failure. */
eb383413 3644
59727473
DD
3645CP_STATIC_IF_GLIBCPP_V3
3646char *
9334f9c6
DD
3647cplus_demangle_print (int options, const struct demangle_component *dc,
3648 int estimate, size_t *palc)
d00edca5 3649{
208c1674 3650 struct d_growable_string dgs;
eb383413 3651
208c1674 3652 d_growable_string_init (&dgs, estimate);
eb383413 3653
208c1674
DD
3654 if (! cplus_demangle_print_callback (options, dc,
3655 d_growable_string_callback_adapter,
3656 &dgs))
eb383413 3657 {
208c1674
DD
3658 free (dgs.buf);
3659 *palc = 0;
d00edca5 3660 return NULL;
eb383413 3661 }
eb383413 3662
208c1674
DD
3663 *palc = dgs.allocation_failure ? 1 : dgs.alc;
3664 return dgs.buf;
eb383413
L
3665}
3666
1c08f2c8
DD
3667/* Returns the I'th element of the template arglist ARGS, or NULL on
3668 failure. */
3669
3670static struct demangle_component *
3671d_index_template_argument (struct demangle_component *args, int i)
3672{
3673 struct demangle_component *a;
3674
3675 for (a = args;
3676 a != NULL;
3677 a = d_right (a))
3678 {
3679 if (a->type != DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
3680 return NULL;
3681 if (i <= 0)
3682 break;
3683 --i;
3684 }
3685 if (i != 0 || a == NULL)
3686 return NULL;
3687
3688 return d_left (a);
3689}
3690
3691/* Returns the template argument from the current context indicated by DC,
3692 which is a DEMANGLE_COMPONENT_TEMPLATE_PARAM, or NULL. */
3693
3694static struct demangle_component *
3695d_lookup_template_argument (struct d_print_info *dpi,
3696 const struct demangle_component *dc)
3697{
3698 if (dpi->templates == NULL)
3699 {
3700 d_print_error (dpi);
3701 return NULL;
3702 }
3703
3704 return d_index_template_argument
3705 (d_right (dpi->templates->template_decl),
3706 dc->u.s_number.number);
3707}
3708
3709/* Returns a template argument pack used in DC (any will do), or NULL. */
3710
3711static struct demangle_component *
3712d_find_pack (struct d_print_info *dpi,
3713 const struct demangle_component *dc)
3714{
3715 struct demangle_component *a;
3716 if (dc == NULL)
3717 return NULL;
3718
3719 switch (dc->type)
3720 {
3721 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
3722 a = d_lookup_template_argument (dpi, dc);
3723 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
3724 return a;
3725 return NULL;
3726
3727 case DEMANGLE_COMPONENT_PACK_EXPANSION:
3728 return NULL;
3729
57cf60a5 3730 case DEMANGLE_COMPONENT_LAMBDA:
1c08f2c8
DD
3731 case DEMANGLE_COMPONENT_NAME:
3732 case DEMANGLE_COMPONENT_OPERATOR:
3733 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
3734 case DEMANGLE_COMPONENT_SUB_STD:
3735 case DEMANGLE_COMPONENT_CHARACTER:
e2e1864d 3736 case DEMANGLE_COMPONENT_FUNCTION_PARAM:
67bf71fe 3737 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
1c08f2c8
DD
3738 return NULL;
3739
3740 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
3741 return d_find_pack (dpi, dc->u.s_extended_operator.name);
3742 case DEMANGLE_COMPONENT_CTOR:
3743 return d_find_pack (dpi, dc->u.s_ctor.name);
3744 case DEMANGLE_COMPONENT_DTOR:
3745 return d_find_pack (dpi, dc->u.s_dtor.name);
3746
3747 default:
3748 a = d_find_pack (dpi, d_left (dc));
3749 if (a)
3750 return a;
3751 return d_find_pack (dpi, d_right (dc));
3752 }
3753}
3754
3755/* Returns the length of the template argument pack DC. */
3756
3757static int
3758d_pack_length (const struct demangle_component *dc)
3759{
3760 int count = 0;
3761 while (dc && dc->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
3762 && d_left (dc) != NULL)
3763 {
3764 ++count;
3765 dc = d_right (dc);
3766 }
3767 return count;
3768}
3769
3770/* DC is a component of a mangled expression. Print it, wrapped in parens
3771 if needed. */
3772
3773static void
ddee5e46 3774d_print_subexpr (struct d_print_info *dpi, int options,
1c08f2c8
DD
3775 const struct demangle_component *dc)
3776{
3777 int simple = 0;
e2e1864d 3778 if (dc->type == DEMANGLE_COMPONENT_NAME
eb7b5ddb
DD
3779 || dc->type == DEMANGLE_COMPONENT_QUAL_NAME
3780 || dc->type == DEMANGLE_COMPONENT_INITIALIZER_LIST
e2e1864d 3781 || dc->type == DEMANGLE_COMPONENT_FUNCTION_PARAM)
1c08f2c8
DD
3782 simple = 1;
3783 if (!simple)
3784 d_append_char (dpi, '(');
ddee5e46 3785 d_print_comp (dpi, options, dc);
1c08f2c8
DD
3786 if (!simple)
3787 d_append_char (dpi, ')');
3788}
3789
d00edca5 3790/* Subroutine to handle components. */
eb383413 3791
d00edca5 3792static void
ddee5e46 3793d_print_comp (struct d_print_info *dpi, int options,
9334f9c6 3794 const struct demangle_component *dc)
eb383413 3795{
b24539b3
DD
3796 /* Magic variable to let reference smashing skip over the next modifier
3797 without needing to modify *dc. */
3798 const struct demangle_component *mod_inner = NULL;
3799
d00edca5 3800 if (dc == NULL)
eb383413 3801 {
d00edca5
DD
3802 d_print_error (dpi);
3803 return;
eb383413 3804 }
d00edca5
DD
3805 if (d_print_saw_error (dpi))
3806 return;
eb383413 3807
d00edca5 3808 switch (dc->type)
eb383413 3809 {
59727473 3810 case DEMANGLE_COMPONENT_NAME:
ddee5e46 3811 if ((options & DMGL_JAVA) == 0)
b6fb00c0
DD
3812 d_append_buffer (dpi, dc->u.s_name.s, dc->u.s_name.len);
3813 else
3814 d_print_java_identifier (dpi, dc->u.s_name.s, dc->u.s_name.len);
d00edca5 3815 return;
eb383413 3816
59727473
DD
3817 case DEMANGLE_COMPONENT_QUAL_NAME:
3818 case DEMANGLE_COMPONENT_LOCAL_NAME:
ddee5e46
DD
3819 d_print_comp (dpi, options, d_left (dc));
3820 if ((options & DMGL_JAVA) == 0)
208c1674 3821 d_append_string (dpi, "::");
b6fb00c0
DD
3822 else
3823 d_append_char (dpi, '.');
ddee5e46 3824 d_print_comp (dpi, options, d_right (dc));
d00edca5 3825 return;
eb383413 3826
59727473 3827 case DEMANGLE_COMPONENT_TYPED_NAME:
d00edca5 3828 {
858b45cf 3829 struct d_print_mod *hold_modifiers;
59727473 3830 struct demangle_component *typed_name;
858b45cf
DD
3831 struct d_print_mod adpm[4];
3832 unsigned int i;
d00edca5
DD
3833 struct d_print_template dpt;
3834
3835 /* Pass the name down to the type so that it can be printed in
858b45cf
DD
3836 the right place for the type. We also have to pass down
3837 any CV-qualifiers, which apply to the this parameter. */
3838 hold_modifiers = dpi->modifiers;
c743cf5d 3839 dpi->modifiers = 0;
858b45cf 3840 i = 0;
d00edca5 3841 typed_name = d_left (dc);
858b45cf
DD
3842 while (typed_name != NULL)
3843 {
3844 if (i >= sizeof adpm / sizeof adpm[0])
3845 {
3846 d_print_error (dpi);
3847 return;
3848 }
d00edca5 3849
858b45cf
DD
3850 adpm[i].next = dpi->modifiers;
3851 dpi->modifiers = &adpm[i];
3852 adpm[i].mod = typed_name;
3853 adpm[i].printed = 0;
3854 adpm[i].templates = dpi->templates;
3855 ++i;
3856
59727473
DD
3857 if (typed_name->type != DEMANGLE_COMPONENT_RESTRICT_THIS
3858 && typed_name->type != DEMANGLE_COMPONENT_VOLATILE_THIS
3859 && typed_name->type != DEMANGLE_COMPONENT_CONST_THIS)
858b45cf
DD
3860 break;
3861
3862 typed_name = d_left (typed_name);
3863 }
d00edca5 3864
168b8298
MS
3865 if (typed_name == NULL)
3866 {
3867 d_print_error (dpi);
3868 return;
3869 }
3870
d00edca5
DD
3871 /* If typed_name is a template, then it applies to the
3872 function type as well. */
59727473 3873 if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
d00edca5
DD
3874 {
3875 dpt.next = dpi->templates;
3876 dpi->templates = &dpt;
abf6a75b 3877 dpt.template_decl = typed_name;
d00edca5 3878 }
eb383413 3879
59727473
DD
3880 /* If typed_name is a DEMANGLE_COMPONENT_LOCAL_NAME, then
3881 there may be CV-qualifiers on its right argument which
3882 really apply here; this happens when parsing a class which
3883 is local to a function. */
3884 if (typed_name->type == DEMANGLE_COMPONENT_LOCAL_NAME)
d4edd112 3885 {
59727473 3886 struct demangle_component *local_name;
d4edd112
DD
3887
3888 local_name = d_right (typed_name);
664aa91f
DD
3889 if (local_name->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
3890 local_name = local_name->u.s_unary_num.sub;
59727473
DD
3891 while (local_name->type == DEMANGLE_COMPONENT_RESTRICT_THIS
3892 || local_name->type == DEMANGLE_COMPONENT_VOLATILE_THIS
3893 || local_name->type == DEMANGLE_COMPONENT_CONST_THIS)
d4edd112
DD
3894 {
3895 if (i >= sizeof adpm / sizeof adpm[0])
3896 {
3897 d_print_error (dpi);
3898 return;
3899 }
3900
3901 adpm[i] = adpm[i - 1];
3902 adpm[i].next = &adpm[i - 1];
3903 dpi->modifiers = &adpm[i];
3904
3905 adpm[i - 1].mod = local_name;
3906 adpm[i - 1].printed = 0;
3907 adpm[i - 1].templates = dpi->templates;
3908 ++i;
3909
3910 local_name = d_left (local_name);
3911 }
3912 }
3913
ddee5e46 3914 d_print_comp (dpi, options, d_right (dc));
74bcd529 3915
59727473 3916 if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
d00edca5 3917 dpi->templates = dpt.next;
eb383413 3918
858b45cf 3919 /* If the modifiers didn't get printed by the type, print them
d00edca5 3920 now. */
858b45cf 3921 while (i > 0)
d00edca5 3922 {
858b45cf
DD
3923 --i;
3924 if (! adpm[i].printed)
3925 {
3926 d_append_char (dpi, ' ');
ddee5e46 3927 d_print_mod (dpi, options, adpm[i].mod);
858b45cf 3928 }
d00edca5 3929 }
eb383413 3930
858b45cf 3931 dpi->modifiers = hold_modifiers;
eb383413 3932
d00edca5
DD
3933 return;
3934 }
eb383413 3935
59727473 3936 case DEMANGLE_COMPONENT_TEMPLATE:
331c3da2
DD
3937 {
3938 struct d_print_mod *hold_dpm;
208c1674 3939 struct demangle_component *dcl;
331c3da2
DD
3940
3941 /* Don't push modifiers into a template definition. Doing so
3942 could give the wrong definition for a template argument.
3943 Instead, treat the template essentially as a name. */
3944
3945 hold_dpm = dpi->modifiers;
3946 dpi->modifiers = NULL;
3947
208c1674
DD
3948 dcl = d_left (dc);
3949
ddee5e46 3950 if ((options & DMGL_JAVA) != 0
208c1674
DD
3951 && dcl->type == DEMANGLE_COMPONENT_NAME
3952 && dcl->u.s_name.len == 6
3953 && strncmp (dcl->u.s_name.s, "JArray", 6) == 0)
3954 {
3955 /* Special-case Java arrays, so that JArray<TYPE> appears
3956 instead as TYPE[]. */
3957
ddee5e46 3958 d_print_comp (dpi, options, d_right (dc));
208c1674
DD
3959 d_append_string (dpi, "[]");
3960 }
3961 else
3962 {
ddee5e46 3963 d_print_comp (dpi, options, dcl);
208c1674
DD
3964 if (d_last_char (dpi) == '<')
3965 d_append_char (dpi, ' ');
3966 d_append_char (dpi, '<');
ddee5e46 3967 d_print_comp (dpi, options, d_right (dc));
208c1674
DD
3968 /* Avoid generating two consecutive '>' characters, to avoid
3969 the C++ syntactic ambiguity. */
3970 if (d_last_char (dpi) == '>')
3971 d_append_char (dpi, ' ');
3972 d_append_char (dpi, '>');
3973 }
331c3da2
DD
3974
3975 dpi->modifiers = hold_dpm;
3976
3977 return;
3978 }
d00edca5 3979
59727473 3980 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
d00edca5 3981 {
d00edca5 3982 struct d_print_template *hold_dpt;
1c08f2c8 3983 struct demangle_component *a = d_lookup_template_argument (dpi, dc);
eb383413 3984
1c08f2c8
DD
3985 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
3986 a = d_index_template_argument (a, dpi->pack_index);
3987
3988 if (a == NULL)
d00edca5
DD
3989 {
3990 d_print_error (dpi);
3991 return;
3992 }
59666b35 3993
d00edca5
DD
3994 /* While processing this parameter, we need to pop the list of
3995 templates. This is because the template parameter may
3996 itself be a reference to a parameter of an outer
3997 template. */
59666b35 3998
d00edca5
DD
3999 hold_dpt = dpi->templates;
4000 dpi->templates = hold_dpt->next;
eb383413 4001
ddee5e46 4002 d_print_comp (dpi, options, a);
03d5f569 4003
d00edca5 4004 dpi->templates = hold_dpt;
59666b35 4005
d00edca5
DD
4006 return;
4007 }
eb383413 4008
59727473 4009 case DEMANGLE_COMPONENT_CTOR:
ddee5e46 4010 d_print_comp (dpi, options, dc->u.s_ctor.name);
d00edca5
DD
4011 return;
4012
59727473 4013 case DEMANGLE_COMPONENT_DTOR:
d00edca5 4014 d_append_char (dpi, '~');
ddee5e46 4015 d_print_comp (dpi, options, dc->u.s_dtor.name);
d00edca5
DD
4016 return;
4017
59727473 4018 case DEMANGLE_COMPONENT_VTABLE:
208c1674 4019 d_append_string (dpi, "vtable for ");
ddee5e46 4020 d_print_comp (dpi, options, d_left (dc));
d00edca5
DD
4021 return;
4022
59727473 4023 case DEMANGLE_COMPONENT_VTT:
208c1674 4024 d_append_string (dpi, "VTT for ");
ddee5e46 4025 d_print_comp (dpi, options, d_left (dc));
d00edca5
DD
4026 return;
4027
59727473 4028 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
208c1674 4029 d_append_string (dpi, "construction vtable for ");
ddee5e46 4030 d_print_comp (dpi, options, d_left (dc));
208c1674 4031 d_append_string (dpi, "-in-");
ddee5e46 4032 d_print_comp (dpi, options, d_right (dc));
d00edca5
DD
4033 return;
4034
59727473 4035 case DEMANGLE_COMPONENT_TYPEINFO:
208c1674 4036 d_append_string (dpi, "typeinfo for ");
ddee5e46 4037 d_print_comp (dpi, options, d_left (dc));
d00edca5
DD
4038 return;
4039
59727473 4040 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
208c1674 4041 d_append_string (dpi, "typeinfo name for ");
ddee5e46 4042 d_print_comp (dpi, options, d_left (dc));
d00edca5
DD
4043 return;
4044
59727473 4045 case DEMANGLE_COMPONENT_TYPEINFO_FN:
208c1674 4046 d_append_string (dpi, "typeinfo fn for ");
ddee5e46 4047 d_print_comp (dpi, options, d_left (dc));
d00edca5
DD
4048 return;
4049
59727473 4050 case DEMANGLE_COMPONENT_THUNK:
208c1674 4051 d_append_string (dpi, "non-virtual thunk to ");
ddee5e46 4052 d_print_comp (dpi, options, d_left (dc));
d00edca5
DD
4053 return;
4054
59727473 4055 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
208c1674 4056 d_append_string (dpi, "virtual thunk to ");
ddee5e46 4057 d_print_comp (dpi, options, d_left (dc));
d00edca5
DD
4058 return;
4059
59727473 4060 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
208c1674 4061 d_append_string (dpi, "covariant return thunk to ");
ddee5e46 4062 d_print_comp (dpi, options, d_left (dc));
d00edca5
DD
4063 return;
4064
59727473 4065 case DEMANGLE_COMPONENT_JAVA_CLASS:
208c1674 4066 d_append_string (dpi, "java Class for ");
ddee5e46 4067 d_print_comp (dpi, options, d_left (dc));
d00edca5
DD
4068 return;
4069
59727473 4070 case DEMANGLE_COMPONENT_GUARD:
208c1674 4071 d_append_string (dpi, "guard variable for ");
ddee5e46 4072 d_print_comp (dpi, options, d_left (dc));
d00edca5
DD
4073 return;
4074
59727473 4075 case DEMANGLE_COMPONENT_REFTEMP:
abc6552b
DD
4076 d_append_string (dpi, "reference temporary #");
4077 d_print_comp (dpi, options, d_right (dc));
4078 d_append_string (dpi, " for ");
ddee5e46 4079 d_print_comp (dpi, options, d_left (dc));
d00edca5
DD
4080 return;
4081
839e4798 4082 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
208c1674 4083 d_append_string (dpi, "hidden alias for ");
ddee5e46 4084 d_print_comp (dpi, options, d_left (dc));
839e4798
RH
4085 return;
4086
956a8f8b
DD
4087 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
4088 d_append_string (dpi, "transaction clone for ");
4089 d_print_comp (dpi, options, d_left (dc));
4090 return;
4091
4092 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
4093 d_append_string (dpi, "non-transaction clone for ");
4094 d_print_comp (dpi, options, d_left (dc));
4095 return;
4096
59727473 4097 case DEMANGLE_COMPONENT_SUB_STD:
b6fb00c0 4098 d_append_buffer (dpi, dc->u.s_string.string, dc->u.s_string.len);
d00edca5
DD
4099 return;
4100
59727473
DD
4101 case DEMANGLE_COMPONENT_RESTRICT:
4102 case DEMANGLE_COMPONENT_VOLATILE:
4103 case DEMANGLE_COMPONENT_CONST:
74aee4eb
DD
4104 {
4105 struct d_print_mod *pdpm;
4106
4107 /* When printing arrays, it's possible to have cases where the
4108 same CV-qualifier gets pushed on the stack multiple times.
4109 We only need to print it once. */
4110
4111 for (pdpm = dpi->modifiers; pdpm != NULL; pdpm = pdpm->next)
4112 {
4113 if (! pdpm->printed)
4114 {
4115 if (pdpm->mod->type != DEMANGLE_COMPONENT_RESTRICT
4116 && pdpm->mod->type != DEMANGLE_COMPONENT_VOLATILE
4117 && pdpm->mod->type != DEMANGLE_COMPONENT_CONST)
4118 break;
4119 if (pdpm->mod->type == dc->type)
4120 {
ddee5e46 4121 d_print_comp (dpi, options, d_left (dc));
74aee4eb
DD
4122 return;
4123 }
4124 }
4125 }
4126 }
b24539b3
DD
4127 goto modifier;
4128
4129 case DEMANGLE_COMPONENT_REFERENCE:
4130 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
4131 {
4132 /* Handle reference smashing: & + && = &. */
4133 const struct demangle_component *sub = d_left (dc);
4134 if (sub->type == DEMANGLE_COMPONENT_TEMPLATE_PARAM)
4135 {
4136 struct demangle_component *a = d_lookup_template_argument (dpi, sub);
4137 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4138 a = d_index_template_argument (a, dpi->pack_index);
04aed652
DD
4139
4140 if (a == NULL)
4141 {
4142 d_print_error (dpi);
4143 return;
4144 }
4145
b24539b3
DD
4146 sub = a;
4147 }
4148
4149 if (sub->type == DEMANGLE_COMPONENT_REFERENCE
4150 || sub->type == dc->type)
4151 dc = sub;
4152 else if (sub->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE)
4153 mod_inner = d_left (sub);
4154 }
74aee4eb 4155 /* Fall through. */
b24539b3 4156
59727473
DD
4157 case DEMANGLE_COMPONENT_RESTRICT_THIS:
4158 case DEMANGLE_COMPONENT_VOLATILE_THIS:
4159 case DEMANGLE_COMPONENT_CONST_THIS:
4160 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
4161 case DEMANGLE_COMPONENT_POINTER:
59727473
DD
4162 case DEMANGLE_COMPONENT_COMPLEX:
4163 case DEMANGLE_COMPONENT_IMAGINARY:
b24539b3 4164 modifier:
d00edca5
DD
4165 {
4166 /* We keep a list of modifiers on the stack. */
4167 struct d_print_mod dpm;
eb383413 4168
d00edca5
DD
4169 dpm.next = dpi->modifiers;
4170 dpi->modifiers = &dpm;
4171 dpm.mod = dc;
4172 dpm.printed = 0;
331c3da2 4173 dpm.templates = dpi->templates;
eb383413 4174
b24539b3
DD
4175 if (!mod_inner)
4176 mod_inner = d_left (dc);
4177
4178 d_print_comp (dpi, options, mod_inner);
59666b35 4179
d00edca5
DD
4180 /* If the modifier didn't get printed by the type, print it
4181 now. */
4182 if (! dpm.printed)
ddee5e46 4183 d_print_mod (dpi, options, dc);
eb383413 4184
d00edca5 4185 dpi->modifiers = dpm.next;
eb383413 4186
d00edca5
DD
4187 return;
4188 }
eb383413 4189
59727473 4190 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
ddee5e46 4191 if ((options & DMGL_JAVA) == 0)
b6fb00c0
DD
4192 d_append_buffer (dpi, dc->u.s_builtin.type->name,
4193 dc->u.s_builtin.type->len);
d00edca5 4194 else
b6fb00c0
DD
4195 d_append_buffer (dpi, dc->u.s_builtin.type->java_name,
4196 dc->u.s_builtin.type->java_len);
d00edca5 4197 return;
eb383413 4198
59727473 4199 case DEMANGLE_COMPONENT_VENDOR_TYPE:
ddee5e46 4200 d_print_comp (dpi, options, d_left (dc));
d00edca5 4201 return;
eb383413 4202
59727473 4203 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
d00edca5 4204 {
ddee5e46
DD
4205 if ((options & DMGL_RET_POSTFIX) != 0)
4206 d_print_function_type (dpi,
4207 options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
4208 dc, dpi->modifiers);
7887b2ce
DD
4209
4210 /* Print return type if present */
ddee5e46
DD
4211 if (d_left (dc) != NULL && (options & DMGL_RET_POSTFIX) != 0)
4212 d_print_comp (dpi, options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
4213 d_left (dc));
4214 else if (d_left (dc) != NULL && (options & DMGL_RET_DROP) == 0)
d00edca5
DD
4215 {
4216 struct d_print_mod dpm;
eb383413 4217
d00edca5
DD
4218 /* We must pass this type down as a modifier in order to
4219 print it in the right location. */
d00edca5
DD
4220 dpm.next = dpi->modifiers;
4221 dpi->modifiers = &dpm;
4222 dpm.mod = dc;
4223 dpm.printed = 0;
331c3da2 4224 dpm.templates = dpi->templates;
eb383413 4225
ddee5e46
DD
4226 d_print_comp (dpi, options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
4227 d_left (dc));
eb383413 4228
d00edca5 4229 dpi->modifiers = dpm.next;
eb383413 4230
d00edca5
DD
4231 if (dpm.printed)
4232 return;
eb383413 4233
7887b2ce
DD
4234 /* In standard prefix notation, there is a space between the
4235 return type and the function signature. */
ddee5e46 4236 if ((options & DMGL_RET_POSTFIX) == 0)
7887b2ce 4237 d_append_char (dpi, ' ');
d00edca5 4238 }
eb383413 4239
ddee5e46
DD
4240 if ((options & DMGL_RET_POSTFIX) == 0)
4241 d_print_function_type (dpi,
4242 options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
4243 dc, dpi->modifiers);
03d5f569 4244
d00edca5
DD
4245 return;
4246 }
eb383413 4247
59727473 4248 case DEMANGLE_COMPONENT_ARRAY_TYPE:
d00edca5 4249 {
74aee4eb
DD
4250 struct d_print_mod *hold_modifiers;
4251 struct d_print_mod adpm[4];
4252 unsigned int i;
4253 struct d_print_mod *pdpm;
eb383413 4254
d00edca5 4255 /* We must pass this type down as a modifier in order to print
74aee4eb
DD
4256 multi-dimensional arrays correctly. If the array itself is
4257 CV-qualified, we act as though the element type were
4258 CV-qualified. We do this by copying the modifiers down
4259 rather than fiddling pointers, so that we don't wind up
4260 with a d_print_mod higher on the stack pointing into our
4261 stack frame after we return. */
03d5f569 4262
74aee4eb
DD
4263 hold_modifiers = dpi->modifiers;
4264
4265 adpm[0].next = hold_modifiers;
4266 dpi->modifiers = &adpm[0];
4267 adpm[0].mod = dc;
4268 adpm[0].printed = 0;
4269 adpm[0].templates = dpi->templates;
4270
4271 i = 1;
4272 pdpm = hold_modifiers;
4273 while (pdpm != NULL
4274 && (pdpm->mod->type == DEMANGLE_COMPONENT_RESTRICT
4275 || pdpm->mod->type == DEMANGLE_COMPONENT_VOLATILE
4276 || pdpm->mod->type == DEMANGLE_COMPONENT_CONST))
4277 {
4278 if (! pdpm->printed)
4279 {
4280 if (i >= sizeof adpm / sizeof adpm[0])
4281 {
4282 d_print_error (dpi);
4283 return;
4284 }
4285
4286 adpm[i] = *pdpm;
4287 adpm[i].next = dpi->modifiers;
4288 dpi->modifiers = &adpm[i];
4289 pdpm->printed = 1;
4290 ++i;
4291 }
4292
4293 pdpm = pdpm->next;
4294 }
eb383413 4295
ddee5e46 4296 d_print_comp (dpi, options, d_right (dc));
eb383413 4297
74aee4eb 4298 dpi->modifiers = hold_modifiers;
eb383413 4299
74aee4eb 4300 if (adpm[0].printed)
d00edca5 4301 return;
eb383413 4302
74aee4eb
DD
4303 while (i > 1)
4304 {
4305 --i;
ddee5e46 4306 d_print_mod (dpi, options, adpm[i].mod);
74aee4eb
DD
4307 }
4308
ddee5e46 4309 d_print_array_type (dpi, options, dc, dpi->modifiers);
eb383413 4310
d00edca5
DD
4311 return;
4312 }
eb383413 4313
59727473 4314 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
cbc43128 4315 case DEMANGLE_COMPONENT_VECTOR_TYPE:
d00edca5 4316 {
d00edca5
DD
4317 struct d_print_mod dpm;
4318
d00edca5
DD
4319 dpm.next = dpi->modifiers;
4320 dpi->modifiers = &dpm;
4321 dpm.mod = dc;
4322 dpm.printed = 0;
331c3da2 4323 dpm.templates = dpi->templates;
d00edca5 4324
ddee5e46 4325 d_print_comp (dpi, options, d_right (dc));
d00edca5
DD
4326
4327 /* If the modifier didn't get printed by the type, print it
4328 now. */
4329 if (! dpm.printed)
ddee5e46 4330 d_print_mod (dpi, options, dc);
eb383413 4331
d00edca5 4332 dpi->modifiers = dpm.next;
eb383413 4333
d00edca5
DD
4334 return;
4335 }
eb383413 4336
d2825c1a
DD
4337 case DEMANGLE_COMPONENT_FIXED_TYPE:
4338 if (dc->u.s_fixed.sat)
4339 d_append_string (dpi, "_Sat ");
4340 /* Don't print "int _Accum". */
4341 if (dc->u.s_fixed.length->u.s_builtin.type
4342 != &cplus_demangle_builtin_types['i'-'a'])
4343 {
ddee5e46 4344 d_print_comp (dpi, options, dc->u.s_fixed.length);
d2825c1a
DD
4345 d_append_char (dpi, ' ');
4346 }
4347 if (dc->u.s_fixed.accum)
4348 d_append_string (dpi, "_Accum");
4349 else
4350 d_append_string (dpi, "_Fract");
4351 return;
4352
59727473
DD
4353 case DEMANGLE_COMPONENT_ARGLIST:
4354 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
1c08f2c8 4355 if (d_left (dc) != NULL)
ddee5e46 4356 d_print_comp (dpi, options, d_left (dc));
d00edca5
DD
4357 if (d_right (dc) != NULL)
4358 {
4e59450e 4359 size_t len;
3baae9d6
JJ
4360 unsigned long int flush_count;
4361 /* Make sure ", " isn't flushed by d_append_string, otherwise
4362 dpi->len -= 2 wouldn't work. */
4363 if (dpi->len >= sizeof (dpi->buf) - 2)
4364 d_print_flush (dpi);
208c1674 4365 d_append_string (dpi, ", ");
4e59450e 4366 len = dpi->len;
3baae9d6 4367 flush_count = dpi->flush_count;
ddee5e46 4368 d_print_comp (dpi, options, d_right (dc));
4e59450e
DD
4369 /* If that didn't print anything (which can happen with empty
4370 template argument packs), remove the comma and space. */
3baae9d6 4371 if (dpi->flush_count == flush_count && dpi->len == len)
4e59450e 4372 dpi->len -= 2;
d00edca5
DD
4373 }
4374 return;
eb383413 4375
eb7b5ddb
DD
4376 case DEMANGLE_COMPONENT_INITIALIZER_LIST:
4377 {
4378 struct demangle_component *type = d_left (dc);
4379 struct demangle_component *list = d_right (dc);
4380
4381 if (type)
4382 d_print_comp (dpi, options, type);
4383 d_append_char (dpi, '{');
4384 d_print_comp (dpi, options, list);
4385 d_append_char (dpi, '}');
4386 }
4387 return;
4388
59727473 4389 case DEMANGLE_COMPONENT_OPERATOR:
d00edca5 4390 {
fbfd63c0
DD
4391 const struct demangle_operator_info *op = dc->u.s_operator.op;
4392 int len = op->len;
d00edca5 4393
208c1674 4394 d_append_string (dpi, "operator");
fbfd63c0
DD
4395 /* Add a space before new/delete. */
4396 if (IS_LOWER (op->name[0]))
d00edca5 4397 d_append_char (dpi, ' ');
fbfd63c0
DD
4398 /* Omit a trailing space. */
4399 if (op->name[len-1] == ' ')
4400 --len;
4401 d_append_buffer (dpi, op->name, len);
d00edca5
DD
4402 return;
4403 }
eb383413 4404
59727473 4405 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
208c1674 4406 d_append_string (dpi, "operator ");
ddee5e46 4407 d_print_comp (dpi, options, dc->u.s_extended_operator.name);
d00edca5 4408 return;
eb383413 4409
59727473 4410 case DEMANGLE_COMPONENT_CAST:
208c1674 4411 d_append_string (dpi, "operator ");
ddee5e46 4412 d_print_cast (dpi, options, dc);
d00edca5 4413 return;
eb383413 4414
eb7b5ddb
DD
4415 case DEMANGLE_COMPONENT_NULLARY:
4416 d_print_expr_op (dpi, options, d_left (dc));
4417 return;
4418
59727473 4419 case DEMANGLE_COMPONENT_UNARY:
eb7b5ddb
DD
4420 {
4421 struct demangle_component *op = d_left (dc);
4422 struct demangle_component *operand = d_right (dc);
4423 const char *code = NULL;
02e7efbf 4424
eb7b5ddb
DD
4425 if (op->type == DEMANGLE_COMPONENT_OPERATOR)
4426 {
4427 code = op->u.s_operator.op->code;
4428 if (!strcmp (code, "ad"))
4429 {
4430 /* Don't print the argument list for the address of a
4431 function. */
4432 if (operand->type == DEMANGLE_COMPONENT_TYPED_NAME
4433 && d_left (operand)->type == DEMANGLE_COMPONENT_QUAL_NAME
4434 && d_right (operand)->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
4435 operand = d_left (operand);
4436 }
4437 if (operand->type == DEMANGLE_COMPONENT_BINARY_ARGS)
4438 {
4439 /* This indicates a suffix operator. */
4440 operand = d_left (operand);
4441 d_print_subexpr (dpi, options, operand);
4442 d_print_expr_op (dpi, options, op);
4443 return;
4444 }
4445 }
02e7efbf 4446
eb7b5ddb
DD
4447 if (op->type != DEMANGLE_COMPONENT_CAST)
4448 d_print_expr_op (dpi, options, op);
4449 else
4450 {
4451 d_append_char (dpi, '(');
4452 d_print_cast (dpi, options, op);
4453 d_append_char (dpi, ')');
4454 }
4455 if (code && !strcmp (code, "gs"))
4456 /* Avoid parens after '::'. */
4457 d_print_comp (dpi, options, operand);
4458 else if (code && !strcmp (code, "st"))
4459 /* Always print parens for sizeof (type). */
4460 {
4461 d_append_char (dpi, '(');
4462 d_print_comp (dpi, options, operand);
4463 d_append_char (dpi, ')');
4464 }
4465 else
4466 d_print_subexpr (dpi, options, operand);
4467 }
d00edca5
DD
4468 return;
4469
59727473
DD
4470 case DEMANGLE_COMPONENT_BINARY:
4471 if (d_right (dc)->type != DEMANGLE_COMPONENT_BINARY_ARGS)
eb383413 4472 {
d00edca5
DD
4473 d_print_error (dpi);
4474 return;
eb383413 4475 }
858b45cf 4476
7c328963
DD
4477 if (op_is_new_cast (d_left (dc)))
4478 {
4479 d_print_expr_op (dpi, options, d_left (dc));
4480 d_append_char (dpi, '<');
4481 d_print_comp (dpi, options, d_left (d_right (dc)));
4482 d_append_string (dpi, ">(");
4483 d_print_comp (dpi, options, d_right (d_right (dc)));
4484 d_append_char (dpi, ')');
4485 return;
4486 }
4487
858b45cf
DD
4488 /* We wrap an expression which uses the greater-than operator in
4489 an extra layer of parens so that it does not get confused
4490 with the '>' which ends the template parameters. */
59727473 4491 if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
b6fb00c0
DD
4492 && d_left (dc)->u.s_operator.op->len == 1
4493 && d_left (dc)->u.s_operator.op->name[0] == '>')
858b45cf
DD
4494 d_append_char (dpi, '(');
4495
02e7efbf
JK
4496 if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") == 0
4497 && d_left (d_right (dc))->type == DEMANGLE_COMPONENT_TYPED_NAME)
4498 {
4499 /* Function call used in an expression should not have printed types
4500 of the function arguments. Values of the function arguments still
4501 get printed below. */
4502
4503 const struct demangle_component *func = d_left (d_right (dc));
4504
4505 if (d_right (func)->type != DEMANGLE_COMPONENT_FUNCTION_TYPE)
4506 d_print_error (dpi);
4507 d_print_subexpr (dpi, options, d_left (func));
4508 }
4509 else
4510 d_print_subexpr (dpi, options, d_left (d_right (dc)));
9ac9c2b6
DD
4511 if (strcmp (d_left (dc)->u.s_operator.op->code, "ix") == 0)
4512 {
4513 d_append_char (dpi, '[');
ddee5e46 4514 d_print_comp (dpi, options, d_right (d_right (dc)));
9ac9c2b6
DD
4515 d_append_char (dpi, ']');
4516 }
4517 else
4518 {
4519 if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") != 0)
ddee5e46
DD
4520 d_print_expr_op (dpi, options, d_left (dc));
4521 d_print_subexpr (dpi, options, d_right (d_right (dc)));
9ac9c2b6 4522 }
858b45cf 4523
59727473 4524 if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
b6fb00c0
DD
4525 && d_left (dc)->u.s_operator.op->len == 1
4526 && d_left (dc)->u.s_operator.op->name[0] == '>')
858b45cf
DD
4527 d_append_char (dpi, ')');
4528
d00edca5
DD
4529 return;
4530
59727473
DD
4531 case DEMANGLE_COMPONENT_BINARY_ARGS:
4532 /* We should only see this as part of DEMANGLE_COMPONENT_BINARY. */
d00edca5
DD
4533 d_print_error (dpi);
4534 return;
4535
59727473
DD
4536 case DEMANGLE_COMPONENT_TRINARY:
4537 if (d_right (dc)->type != DEMANGLE_COMPONENT_TRINARY_ARG1
4538 || d_right (d_right (dc))->type != DEMANGLE_COMPONENT_TRINARY_ARG2)
d00edca5
DD
4539 {
4540 d_print_error (dpi);
4541 return;
4542 }
eb7b5ddb
DD
4543 {
4544 struct demangle_component *op = d_left (dc);
4545 struct demangle_component *first = d_left (d_right (dc));
4546 struct demangle_component *second = d_left (d_right (d_right (dc)));
4547 struct demangle_component *third = d_right (d_right (d_right (dc)));
4548
4549 if (!strcmp (op->u.s_operator.op->code, "qu"))
4550 {
4551 d_print_subexpr (dpi, options, first);
4552 d_print_expr_op (dpi, options, op);
4553 d_print_subexpr (dpi, options, second);
4554 d_append_string (dpi, " : ");
4555 d_print_subexpr (dpi, options, third);
4556 }
4557 else
4558 {
4559 d_append_string (dpi, "new ");
4560 if (d_left (first) != NULL)
4561 {
4562 d_print_subexpr (dpi, options, first);
4563 d_append_char (dpi, ' ');
4564 }
4565 d_print_comp (dpi, options, second);
4566 if (third)
4567 d_print_subexpr (dpi, options, third);
4568 }
4569 }
d00edca5
DD
4570 return;
4571
59727473
DD
4572 case DEMANGLE_COMPONENT_TRINARY_ARG1:
4573 case DEMANGLE_COMPONENT_TRINARY_ARG2:
4574 /* We should only see these are part of DEMANGLE_COMPONENT_TRINARY. */
d00edca5
DD
4575 d_print_error (dpi);
4576 return;
4577
59727473
DD
4578 case DEMANGLE_COMPONENT_LITERAL:
4579 case DEMANGLE_COMPONENT_LITERAL_NEG:
2d733211
DD
4580 {
4581 enum d_builtin_type_print tp;
d00edca5 4582
2d733211
DD
4583 /* For some builtin types, produce simpler output. */
4584 tp = D_PRINT_DEFAULT;
4585 if (d_left (dc)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE)
4586 {
4587 tp = d_left (dc)->u.s_builtin.type->print;
4588 switch (tp)
4589 {
4590 case D_PRINT_INT:
4591 case D_PRINT_UNSIGNED:
4592 case D_PRINT_LONG:
4593 case D_PRINT_UNSIGNED_LONG:
4594 case D_PRINT_LONG_LONG:
4595 case D_PRINT_UNSIGNED_LONG_LONG:
4596 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME)
4597 {
4598 if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
4599 d_append_char (dpi, '-');
ddee5e46 4600 d_print_comp (dpi, options, d_right (dc));
2d733211
DD
4601 switch (tp)
4602 {
4603 default:
4604 break;
4605 case D_PRINT_UNSIGNED:
4606 d_append_char (dpi, 'u');
4607 break;
4608 case D_PRINT_LONG:
4609 d_append_char (dpi, 'l');
4610 break;
4611 case D_PRINT_UNSIGNED_LONG:
208c1674 4612 d_append_string (dpi, "ul");
2d733211
DD
4613 break;
4614 case D_PRINT_LONG_LONG:
208c1674 4615 d_append_string (dpi, "ll");
2d733211
DD
4616 break;
4617 case D_PRINT_UNSIGNED_LONG_LONG:
208c1674 4618 d_append_string (dpi, "ull");
2d733211
DD
4619 break;
4620 }
4621 return;
4622 }
4623 break;
eb383413 4624
2d733211
DD
4625 case D_PRINT_BOOL:
4626 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME
4627 && d_right (dc)->u.s_name.len == 1
4628 && dc->type == DEMANGLE_COMPONENT_LITERAL)
4629 {
4630 switch (d_right (dc)->u.s_name.s[0])
4631 {
4632 case '0':
208c1674 4633 d_append_string (dpi, "false");
2d733211
DD
4634 return;
4635 case '1':
208c1674 4636 d_append_string (dpi, "true");
2d733211
DD
4637 return;
4638 default:
4639 break;
4640 }
4641 }
4642 break;
03d5f569 4643
2d733211
DD
4644 default:
4645 break;
4646 }
4647 }
eb383413 4648
2d733211 4649 d_append_char (dpi, '(');
ddee5e46 4650 d_print_comp (dpi, options, d_left (dc));
2d733211
DD
4651 d_append_char (dpi, ')');
4652 if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
4653 d_append_char (dpi, '-');
4654 if (tp == D_PRINT_FLOAT)
4655 d_append_char (dpi, '[');
ddee5e46 4656 d_print_comp (dpi, options, d_right (dc));
2d733211
DD
4657 if (tp == D_PRINT_FLOAT)
4658 d_append_char (dpi, ']');
4659 }
d00edca5 4660 return;
eb383413 4661
cbc43128
DD
4662 case DEMANGLE_COMPONENT_NUMBER:
4663 d_append_num (dpi, dc->u.s_number.number);
4664 return;
4665
830ef634
DD
4666 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
4667 d_append_string (dpi, "java resource ");
ddee5e46 4668 d_print_comp (dpi, options, d_left (dc));
830ef634
DD
4669 return;
4670
4671 case DEMANGLE_COMPONENT_COMPOUND_NAME:
ddee5e46
DD
4672 d_print_comp (dpi, options, d_left (dc));
4673 d_print_comp (dpi, options, d_right (dc));
830ef634
DD
4674 return;
4675
4676 case DEMANGLE_COMPONENT_CHARACTER:
4677 d_append_char (dpi, dc->u.s_character.character);
4678 return;
4679
ba8cb4ba
DD
4680 case DEMANGLE_COMPONENT_DECLTYPE:
4681 d_append_string (dpi, "decltype (");
ddee5e46 4682 d_print_comp (dpi, options, d_left (dc));
ba8cb4ba
DD
4683 d_append_char (dpi, ')');
4684 return;
4685
1c08f2c8
DD
4686 case DEMANGLE_COMPONENT_PACK_EXPANSION:
4687 {
e2e1864d 4688 int len;
1c08f2c8 4689 int i;
e2e1864d
DD
4690 struct demangle_component *a = d_find_pack (dpi, d_left (dc));
4691 if (a == NULL)
4692 {
4693 /* d_find_pack won't find anything if the only packs involved
4694 in this expansion are function parameter packs; in that
4695 case, just print the pattern and "...". */
ddee5e46 4696 d_print_subexpr (dpi, options, d_left (dc));
e2e1864d
DD
4697 d_append_string (dpi, "...");
4698 return;
4699 }
1c08f2c8 4700
e2e1864d 4701 len = d_pack_length (a);
1c08f2c8
DD
4702 dc = d_left (dc);
4703 for (i = 0; i < len; ++i)
4704 {
4705 dpi->pack_index = i;
ddee5e46 4706 d_print_comp (dpi, options, dc);
1c08f2c8
DD
4707 if (i < len-1)
4708 d_append_string (dpi, ", ");
4709 }
4710 }
4711 return;
4712
c743cf5d 4713 case DEMANGLE_COMPONENT_FUNCTION_PARAM:
f2917a30
DD
4714 {
4715 long num = dc->u.s_number.number;
4716 if (num == 0)
4717 d_append_string (dpi, "this");
4718 else
4719 {
4720 d_append_string (dpi, "{parm#");
4721 d_append_num (dpi, num);
4722 d_append_char (dpi, '}');
4723 }
4724 }
664aa91f 4725 return;
c743cf5d 4726
d5031754
DD
4727 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
4728 d_append_string (dpi, "global constructors keyed to ");
ddee5e46 4729 d_print_comp (dpi, options, dc->u.s_binary.left);
d5031754
DD
4730 return;
4731
4732 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
4733 d_append_string (dpi, "global destructors keyed to ");
ddee5e46 4734 d_print_comp (dpi, options, dc->u.s_binary.left);
d5031754
DD
4735 return;
4736
664aa91f
DD
4737 case DEMANGLE_COMPONENT_LAMBDA:
4738 d_append_string (dpi, "{lambda(");
ddee5e46 4739 d_print_comp (dpi, options, dc->u.s_unary_num.sub);
664aa91f
DD
4740 d_append_string (dpi, ")#");
4741 d_append_num (dpi, dc->u.s_unary_num.num + 1);
4742 d_append_char (dpi, '}');
4743 return;
4744
4745 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
4746 d_append_string (dpi, "{unnamed type#");
4747 d_append_num (dpi, dc->u.s_number.number + 1);
4748 d_append_char (dpi, '}');
4749 return;
4750
7955ede5
DD
4751 case DEMANGLE_COMPONENT_CLONE:
4752 d_print_comp (dpi, options, d_left (dc));
4753 d_append_string (dpi, " [clone ");
4754 d_print_comp (dpi, options, d_right (dc));
4755 d_append_char (dpi, ']');
4756 return;
4757
d00edca5
DD
4758 default:
4759 d_print_error (dpi);
4760 return;
4761 }
eb383413
L
4762}
4763
b6fb00c0
DD
4764/* Print a Java dentifier. For Java we try to handle encoded extended
4765 Unicode characters. The C++ ABI doesn't mention Unicode encoding,
4766 so we don't it for C++. Characters are encoded as
4767 __U<hex-char>+_. */
eb383413 4768
d00edca5 4769static void
9334f9c6 4770d_print_java_identifier (struct d_print_info *dpi, const char *name, int len)
eb383413 4771{
b6fb00c0
DD
4772 const char *p;
4773 const char *end;
eb383413 4774
b6fb00c0
DD
4775 end = name + len;
4776 for (p = name; p < end; ++p)
4777 {
4778 if (end - p > 3
4779 && p[0] == '_'
4780 && p[1] == '_'
4781 && p[2] == 'U')
eb383413 4782 {
b6fb00c0
DD
4783 unsigned long c;
4784 const char *q;
4785
4786 c = 0;
4787 for (q = p + 3; q < end; ++q)
d00edca5 4788 {
b6fb00c0
DD
4789 int dig;
4790
4791 if (IS_DIGIT (*q))
4792 dig = *q - '0';
4793 else if (*q >= 'A' && *q <= 'F')
4794 dig = *q - 'A' + 10;
4795 else if (*q >= 'a' && *q <= 'f')
4796 dig = *q - 'a' + 10;
4797 else
4798 break;
eb383413 4799
b6fb00c0
DD
4800 c = c * 16 + dig;
4801 }
4802 /* If the Unicode character is larger than 256, we don't try
4803 to deal with it here. FIXME. */
4804 if (q < end && *q == '_' && c < 256)
4805 {
4806 d_append_char (dpi, c);
4807 p = q;
4808 continue;
d00edca5 4809 }
d00edca5 4810 }
b6fb00c0
DD
4811
4812 d_append_char (dpi, *p);
eb383413 4813 }
eb383413
L
4814}
4815
858b45cf
DD
4816/* Print a list of modifiers. SUFFIX is 1 if we are printing
4817 qualifiers on this after printing a function. */
eb383413 4818
d00edca5 4819static void
ddee5e46 4820d_print_mod_list (struct d_print_info *dpi, int options,
9334f9c6 4821 struct d_print_mod *mods, int suffix)
eb383413 4822{
331c3da2
DD
4823 struct d_print_template *hold_dpt;
4824
858b45cf 4825 if (mods == NULL || d_print_saw_error (dpi))
d00edca5 4826 return;
eb383413 4827
858b45cf
DD
4828 if (mods->printed
4829 || (! suffix
59727473
DD
4830 && (mods->mod->type == DEMANGLE_COMPONENT_RESTRICT_THIS
4831 || mods->mod->type == DEMANGLE_COMPONENT_VOLATILE_THIS
4832 || mods->mod->type == DEMANGLE_COMPONENT_CONST_THIS)))
858b45cf 4833 {
ddee5e46 4834 d_print_mod_list (dpi, options, mods->next, suffix);
858b45cf
DD
4835 return;
4836 }
4837
331c3da2
DD
4838 mods->printed = 1;
4839
4840 hold_dpt = dpi->templates;
4841 dpi->templates = mods->templates;
4842
59727473 4843 if (mods->mod->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
eb383413 4844 {
ddee5e46 4845 d_print_function_type (dpi, options, mods->mod, mods->next);
331c3da2 4846 dpi->templates = hold_dpt;
d00edca5
DD
4847 return;
4848 }
59727473 4849 else if (mods->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
d00edca5 4850 {
ddee5e46 4851 d_print_array_type (dpi, options, mods->mod, mods->next);
331c3da2 4852 dpi->templates = hold_dpt;
d00edca5
DD
4853 return;
4854 }
59727473 4855 else if (mods->mod->type == DEMANGLE_COMPONENT_LOCAL_NAME)
d4edd112
DD
4856 {
4857 struct d_print_mod *hold_modifiers;
59727473 4858 struct demangle_component *dc;
d4edd112
DD
4859
4860 /* When this is on the modifier stack, we have pulled any
4861 qualifiers off the right argument already. Otherwise, we
4862 print it as usual, but don't let the left argument see any
4863 modifiers. */
4864
4865 hold_modifiers = dpi->modifiers;
4866 dpi->modifiers = NULL;
ddee5e46 4867 d_print_comp (dpi, options, d_left (mods->mod));
d4edd112
DD
4868 dpi->modifiers = hold_modifiers;
4869
ddee5e46 4870 if ((options & DMGL_JAVA) == 0)
208c1674 4871 d_append_string (dpi, "::");
b6fb00c0
DD
4872 else
4873 d_append_char (dpi, '.');
d4edd112
DD
4874
4875 dc = d_right (mods->mod);
664aa91f
DD
4876
4877 if (dc->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
4878 {
4879 d_append_string (dpi, "{default arg#");
4880 d_append_num (dpi, dc->u.s_unary_num.num + 1);
4881 d_append_string (dpi, "}::");
4882 dc = dc->u.s_unary_num.sub;
4883 }
4884
59727473
DD
4885 while (dc->type == DEMANGLE_COMPONENT_RESTRICT_THIS
4886 || dc->type == DEMANGLE_COMPONENT_VOLATILE_THIS
4887 || dc->type == DEMANGLE_COMPONENT_CONST_THIS)
d4edd112
DD
4888 dc = d_left (dc);
4889
ddee5e46 4890 d_print_comp (dpi, options, dc);
d4edd112
DD
4891
4892 dpi->templates = hold_dpt;
4893 return;
4894 }
eb383413 4895
ddee5e46 4896 d_print_mod (dpi, options, mods->mod);
eb383413 4897
331c3da2
DD
4898 dpi->templates = hold_dpt;
4899
ddee5e46 4900 d_print_mod_list (dpi, options, mods->next, suffix);
eb383413 4901}
331c3da2 4902
d00edca5 4903/* Print a modifier. */
eb383413 4904
d00edca5 4905static void
ddee5e46 4906d_print_mod (struct d_print_info *dpi, int options,
9334f9c6 4907 const struct demangle_component *mod)
d00edca5
DD
4908{
4909 switch (mod->type)
4910 {
59727473
DD
4911 case DEMANGLE_COMPONENT_RESTRICT:
4912 case DEMANGLE_COMPONENT_RESTRICT_THIS:
208c1674 4913 d_append_string (dpi, " restrict");
d00edca5 4914 return;
59727473
DD
4915 case DEMANGLE_COMPONENT_VOLATILE:
4916 case DEMANGLE_COMPONENT_VOLATILE_THIS:
208c1674 4917 d_append_string (dpi, " volatile");
d00edca5 4918 return;
59727473
DD
4919 case DEMANGLE_COMPONENT_CONST:
4920 case DEMANGLE_COMPONENT_CONST_THIS:
208c1674 4921 d_append_string (dpi, " const");
d00edca5 4922 return;
59727473 4923 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
d00edca5 4924 d_append_char (dpi, ' ');
ddee5e46 4925 d_print_comp (dpi, options, d_right (mod));
d00edca5 4926 return;
59727473 4927 case DEMANGLE_COMPONENT_POINTER:
d00edca5 4928 /* There is no pointer symbol in Java. */
ddee5e46 4929 if ((options & DMGL_JAVA) == 0)
d00edca5
DD
4930 d_append_char (dpi, '*');
4931 return;
59727473 4932 case DEMANGLE_COMPONENT_REFERENCE:
d00edca5
DD
4933 d_append_char (dpi, '&');
4934 return;
8969a67f
DD
4935 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
4936 d_append_string (dpi, "&&");
4937 return;
59727473 4938 case DEMANGLE_COMPONENT_COMPLEX:
208c1674 4939 d_append_string (dpi, "complex ");
d00edca5 4940 return;
59727473 4941 case DEMANGLE_COMPONENT_IMAGINARY:
208c1674 4942 d_append_string (dpi, "imaginary ");
d00edca5 4943 return;
59727473 4944 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
858b45cf 4945 if (d_last_char (dpi) != '(')
d00edca5 4946 d_append_char (dpi, ' ');
ddee5e46 4947 d_print_comp (dpi, options, d_left (mod));
208c1674 4948 d_append_string (dpi, "::*");
d00edca5 4949 return;
59727473 4950 case DEMANGLE_COMPONENT_TYPED_NAME:
ddee5e46 4951 d_print_comp (dpi, options, d_left (mod));
d00edca5 4952 return;
cbc43128 4953 case DEMANGLE_COMPONENT_VECTOR_TYPE:
f9b58c5b 4954 d_append_string (dpi, " __vector(");
ddee5e46 4955 d_print_comp (dpi, options, d_left (mod));
f9b58c5b 4956 d_append_char (dpi, ')');
cbc43128
DD
4957 return;
4958
d00edca5
DD
4959 default:
4960 /* Otherwise, we have something that won't go back on the
4961 modifier stack, so we can just print it. */
ddee5e46 4962 d_print_comp (dpi, options, mod);
d00edca5
DD
4963 return;
4964 }
4965}
eb383413 4966
d00edca5 4967/* Print a function type, except for the return type. */
eb383413 4968
d00edca5 4969static void
ddee5e46 4970d_print_function_type (struct d_print_info *dpi, int options,
9334f9c6
DD
4971 const struct demangle_component *dc,
4972 struct d_print_mod *mods)
eb383413 4973{
331c3da2 4974 int need_paren;
2d733211 4975 int need_space;
331c3da2 4976 struct d_print_mod *p;
d4edd112 4977 struct d_print_mod *hold_modifiers;
331c3da2
DD
4978
4979 need_paren = 0;
2d733211 4980 need_space = 0;
331c3da2 4981 for (p = mods; p != NULL; p = p->next)
d00edca5 4982 {
331c3da2
DD
4983 if (p->printed)
4984 break;
eb383413 4985
331c3da2 4986 switch (p->mod->type)
d00edca5 4987 {
2d733211
DD
4988 case DEMANGLE_COMPONENT_POINTER:
4989 case DEMANGLE_COMPONENT_REFERENCE:
8969a67f 4990 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
2d733211
DD
4991 need_paren = 1;
4992 break;
59727473
DD
4993 case DEMANGLE_COMPONENT_RESTRICT:
4994 case DEMANGLE_COMPONENT_VOLATILE:
4995 case DEMANGLE_COMPONENT_CONST:
4996 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
59727473
DD
4997 case DEMANGLE_COMPONENT_COMPLEX:
4998 case DEMANGLE_COMPONENT_IMAGINARY:
4999 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
2d733211 5000 need_space = 1;
331c3da2
DD
5001 need_paren = 1;
5002 break;
59727473
DD
5003 case DEMANGLE_COMPONENT_RESTRICT_THIS:
5004 case DEMANGLE_COMPONENT_VOLATILE_THIS:
5005 case DEMANGLE_COMPONENT_CONST_THIS:
858b45cf 5006 break;
331c3da2
DD
5007 default:
5008 break;
d00edca5 5009 }
331c3da2
DD
5010 if (need_paren)
5011 break;
5012 }
eb383413 5013
331c3da2 5014 if (need_paren)
858b45cf 5015 {
2d733211 5016 if (! need_space)
858b45cf 5017 {
2d733211
DD
5018 if (d_last_char (dpi) != '('
5019 && d_last_char (dpi) != '*')
5020 need_space = 1;
858b45cf 5021 }
2d733211
DD
5022 if (need_space && d_last_char (dpi) != ' ')
5023 d_append_char (dpi, ' ');
858b45cf
DD
5024 d_append_char (dpi, '(');
5025 }
eb383413 5026
d4edd112
DD
5027 hold_modifiers = dpi->modifiers;
5028 dpi->modifiers = NULL;
5029
ddee5e46 5030 d_print_mod_list (dpi, options, mods, 0);
eb383413 5031
331c3da2
DD
5032 if (need_paren)
5033 d_append_char (dpi, ')');
eb383413 5034
d00edca5 5035 d_append_char (dpi, '(');
eb383413 5036
d00edca5 5037 if (d_right (dc) != NULL)
ddee5e46 5038 d_print_comp (dpi, options, d_right (dc));
eb383413 5039
d00edca5 5040 d_append_char (dpi, ')');
858b45cf 5041
ddee5e46 5042 d_print_mod_list (dpi, options, mods, 1);
d4edd112
DD
5043
5044 dpi->modifiers = hold_modifiers;
d00edca5 5045}
eb383413 5046
d00edca5 5047/* Print an array type, except for the element type. */
eb383413 5048
d00edca5 5049static void
ddee5e46 5050d_print_array_type (struct d_print_info *dpi, int options,
9334f9c6
DD
5051 const struct demangle_component *dc,
5052 struct d_print_mod *mods)
d00edca5
DD
5053{
5054 int need_space;
eb383413 5055
d00edca5
DD
5056 need_space = 1;
5057 if (mods != NULL)
eb383413 5058 {
d00edca5
DD
5059 int need_paren;
5060 struct d_print_mod *p;
03d5f569 5061
d00edca5
DD
5062 need_paren = 0;
5063 for (p = mods; p != NULL; p = p->next)
eb383413 5064 {
74aee4eb 5065 if (! p->printed)
eb383413 5066 {
74aee4eb
DD
5067 if (p->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
5068 {
5069 need_space = 0;
5070 break;
5071 }
5072 else
5073 {
5074 need_paren = 1;
5075 need_space = 1;
5076 break;
5077 }
eb383413 5078 }
d00edca5 5079 }
eb383413 5080
d00edca5 5081 if (need_paren)
208c1674 5082 d_append_string (dpi, " (");
eb383413 5083
ddee5e46 5084 d_print_mod_list (dpi, options, mods, 0);
eb383413 5085
d00edca5
DD
5086 if (need_paren)
5087 d_append_char (dpi, ')');
5088 }
eb383413 5089
d00edca5
DD
5090 if (need_space)
5091 d_append_char (dpi, ' ');
03d5f569 5092
d00edca5 5093 d_append_char (dpi, '[');
03d5f569 5094
d00edca5 5095 if (d_left (dc) != NULL)
ddee5e46 5096 d_print_comp (dpi, options, d_left (dc));
eb383413 5097
d00edca5
DD
5098 d_append_char (dpi, ']');
5099}
eb383413 5100
d00edca5 5101/* Print an operator in an expression. */
eb383413 5102
d00edca5 5103static void
ddee5e46 5104d_print_expr_op (struct d_print_info *dpi, int options,
9334f9c6 5105 const struct demangle_component *dc)
d00edca5 5106{
59727473 5107 if (dc->type == DEMANGLE_COMPONENT_OPERATOR)
b6fb00c0
DD
5108 d_append_buffer (dpi, dc->u.s_operator.op->name,
5109 dc->u.s_operator.op->len);
d00edca5 5110 else
ddee5e46 5111 d_print_comp (dpi, options, dc);
eb383413
L
5112}
5113
d00edca5 5114/* Print a cast. */
eb383413 5115
d00edca5 5116static void
ddee5e46 5117d_print_cast (struct d_print_info *dpi, int options,
9334f9c6 5118 const struct demangle_component *dc)
eb383413 5119{
59727473 5120 if (d_left (dc)->type != DEMANGLE_COMPONENT_TEMPLATE)
ddee5e46 5121 d_print_comp (dpi, options, d_left (dc));
d00edca5
DD
5122 else
5123 {
331c3da2 5124 struct d_print_mod *hold_dpm;
d00edca5 5125 struct d_print_template dpt;
0976f6a7 5126
d00edca5
DD
5127 /* It appears that for a templated cast operator, we need to put
5128 the template parameters in scope for the operator name, but
5129 not for the parameters. The effect is that we need to handle
24afc00d 5130 the template printing here. */
eb383413 5131
331c3da2
DD
5132 hold_dpm = dpi->modifiers;
5133 dpi->modifiers = NULL;
5134
d00edca5
DD
5135 dpt.next = dpi->templates;
5136 dpi->templates = &dpt;
abf6a75b 5137 dpt.template_decl = d_left (dc);
0976f6a7 5138
ddee5e46 5139 d_print_comp (dpi, options, d_left (d_left (dc)));
0976f6a7 5140
d00edca5 5141 dpi->templates = dpt.next;
eb383413 5142
858b45cf
DD
5143 if (d_last_char (dpi) == '<')
5144 d_append_char (dpi, ' ');
d00edca5 5145 d_append_char (dpi, '<');
ddee5e46 5146 d_print_comp (dpi, options, d_right (d_left (dc)));
d00edca5
DD
5147 /* Avoid generating two consecutive '>' characters, to avoid
5148 the C++ syntactic ambiguity. */
858b45cf 5149 if (d_last_char (dpi) == '>')
d00edca5
DD
5150 d_append_char (dpi, ' ');
5151 d_append_char (dpi, '>');
331c3da2
DD
5152
5153 dpi->modifiers = hold_dpm;
eb383413 5154 }
d00edca5
DD
5155}
5156
5157/* Initialize the information structure we use to pass around
5158 information. */
5159
59727473
DD
5160CP_STATIC_IF_GLIBCPP_V3
5161void
9334f9c6
DD
5162cplus_demangle_init_info (const char *mangled, int options, size_t len,
5163 struct d_info *di)
eb383413 5164{
d00edca5 5165 di->s = mangled;
b6fb00c0 5166 di->send = mangled + len;
d00edca5 5167 di->options = options;
eb383413 5168
d00edca5
DD
5169 di->n = mangled;
5170
5171 /* We can not need more components than twice the number of chars in
5172 the mangled string. Most components correspond directly to
5173 chars, but the ARGLIST types are exceptions. */
5174 di->num_comps = 2 * len;
d00edca5
DD
5175 di->next_comp = 0;
5176
5177 /* Similarly, we can not need more substitutions than there are
331c3da2
DD
5178 chars in the mangled string. */
5179 di->num_subs = len;
d00edca5 5180 di->next_sub = 0;
b6fb00c0 5181 di->did_subs = 0;
d00edca5
DD
5182
5183 di->last_name = NULL;
5184
b6fb00c0 5185 di->expansion = 0;
eb383413
L
5186}
5187
208c1674
DD
5188/* Internal implementation for the demangler. If MANGLED is a g++ v3 ABI
5189 mangled name, return strings in repeated callback giving the demangled
5190 name. OPTIONS is the usual libiberty demangler options. On success,
5191 this returns 1. On failure, returns 0. */
eb383413 5192
208c1674
DD
5193static int
5194d_demangle_callback (const char *mangled, int options,
5195 demangle_callbackref callback, void *opaque)
eb383413 5196{
d5031754
DD
5197 enum
5198 {
5199 DCT_TYPE,
5200 DCT_MANGLED,
5201 DCT_GLOBAL_CTORS,
5202 DCT_GLOBAL_DTORS
5203 }
5204 type;
d00edca5 5205 struct d_info di;
59727473 5206 struct demangle_component *dc;
208c1674 5207 int status;
d00edca5
DD
5208
5209 if (mangled[0] == '_' && mangled[1] == 'Z')
d5031754 5210 type = DCT_MANGLED;
d00edca5
DD
5211 else if (strncmp (mangled, "_GLOBAL_", 8) == 0
5212 && (mangled[8] == '.' || mangled[8] == '_' || mangled[8] == '$')
5213 && (mangled[9] == 'D' || mangled[9] == 'I')
5214 && mangled[10] == '_')
d5031754 5215 type = mangled[9] == 'I' ? DCT_GLOBAL_CTORS : DCT_GLOBAL_DTORS;
eb383413
L
5216 else
5217 {
d00edca5 5218 if ((options & DMGL_TYPES) == 0)
208c1674 5219 return 0;
d5031754 5220 type = DCT_TYPE;
eb383413
L
5221 }
5222
208c1674 5223 cplus_demangle_init_info (mangled, options, strlen (mangled), &di);
03d5f569 5224
b6fb00c0
DD
5225 {
5226#ifdef CP_DYNAMIC_ARRAYS
59727473
DD
5227 __extension__ struct demangle_component comps[di.num_comps];
5228 __extension__ struct demangle_component *subs[di.num_subs];
b6fb00c0 5229
208c1674
DD
5230 di.comps = comps;
5231 di.subs = subs;
b6fb00c0 5232#else
208c1674
DD
5233 di.comps = alloca (di.num_comps * sizeof (*di.comps));
5234 di.subs = alloca (di.num_subs * sizeof (*di.subs));
b6fb00c0
DD
5235#endif
5236
d5031754
DD
5237 switch (type)
5238 {
5239 case DCT_TYPE:
5240 dc = cplus_demangle_type (&di);
5241 break;
5242 case DCT_MANGLED:
5243 dc = cplus_demangle_mangled_name (&di, 1);
5244 break;
5245 case DCT_GLOBAL_CTORS:
5246 case DCT_GLOBAL_DTORS:
5247 d_advance (&di, 11);
5248 dc = d_make_comp (&di,
5249 (type == DCT_GLOBAL_CTORS
5250 ? DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
5251 : DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS),
a0692e36 5252 d_make_demangle_mangled_name (&di, d_str (&di)),
d5031754
DD
5253 NULL);
5254 d_advance (&di, strlen (d_str (&di)));
5255 break;
5256 }
d00edca5 5257
b6fb00c0
DD
5258 /* If DMGL_PARAMS is set, then if we didn't consume the entire
5259 mangled string, then we didn't successfully demangle it. If
5260 DMGL_PARAMS is not set, we didn't look at the trailing
5261 parameters. */
5262 if (((options & DMGL_PARAMS) != 0) && d_peek_char (&di) != '\0')
5263 dc = NULL;
24afc00d 5264
d00edca5 5265#ifdef CP_DEMANGLE_DEBUG
208c1674 5266 d_dump (dc, 0);
d00edca5
DD
5267#endif
5268
208c1674
DD
5269 status = (dc != NULL)
5270 ? cplus_demangle_print_callback (options, dc, callback, opaque)
5271 : 0;
5272 }
03d5f569 5273
208c1674
DD
5274 return status;
5275}
03d5f569 5276
208c1674
DD
5277/* Entry point for the demangler. If MANGLED is a g++ v3 ABI mangled
5278 name, return a buffer allocated with malloc holding the demangled
5279 name. OPTIONS is the usual libiberty demangler options. On
5280 success, this sets *PALC to the allocated size of the returned
5281 buffer. On failure, this sets *PALC to 0 for a bad name, or 1 for
5282 a memory allocation failure, and returns NULL. */
b6fb00c0 5283
208c1674
DD
5284static char *
5285d_demangle (const char *mangled, int options, size_t *palc)
5286{
5287 struct d_growable_string dgs;
5288 int status;
03d5f569 5289
208c1674
DD
5290 d_growable_string_init (&dgs, 0);
5291
5292 status = d_demangle_callback (mangled, options,
5293 d_growable_string_callback_adapter, &dgs);
5294 if (status == 0)
5295 {
5296 free (dgs.buf);
5297 *palc = 0;
5298 return NULL;
5299 }
5300
ffe7cfdf 5301 *palc = dgs.allocation_failure ? 1 : dgs.alc;
208c1674 5302 return dgs.buf;
eb383413
L
5303}
5304
0c4460bb 5305#if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3)
d00edca5 5306
9334f9c6 5307extern char *__cxa_demangle (const char *, char *, size_t *, int *);
03d5f569 5308
d00edca5
DD
5309/* ia64 ABI-mandated entry point in the C++ runtime library for
5310 performing demangling. MANGLED_NAME is a NUL-terminated character
5311 string containing the name to be demangled.
03d5f569
JM
5312
5313 OUTPUT_BUFFER is a region of memory, allocated with malloc, of
5314 *LENGTH bytes, into which the demangled name is stored. If
5315 OUTPUT_BUFFER is not long enough, it is expanded using realloc.
5316 OUTPUT_BUFFER may instead be NULL; in that case, the demangled name
d00edca5 5317 is placed in a region of memory allocated with malloc.
03d5f569 5318
208c1674 5319 If LENGTH is non-NULL, the length of the buffer containing the
d00edca5 5320 demangled name, is placed in *LENGTH.
03d5f569
JM
5321
5322 The return value is a pointer to the start of the NUL-terminated
5323 demangled name, or NULL if the demangling fails. The caller is
d00edca5 5324 responsible for deallocating this memory using free.
03d5f569
JM
5325
5326 *STATUS is set to one of the following values:
5327 0: The demangling operation succeeded.
d00edca5 5328 -1: A memory allocation failure occurred.
03d5f569
JM
5329 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
5330 -3: One of the arguments is invalid.
5331
d00edca5 5332 The demangling is performed using the C++ ABI mangling rules, with
03d5f569
JM
5333 GNU extensions. */
5334
5335char *
9334f9c6
DD
5336__cxa_demangle (const char *mangled_name, char *output_buffer,
5337 size_t *length, int *status)
03d5f569 5338{
d00edca5
DD
5339 char *demangled;
5340 size_t alc;
03d5f569 5341
d00edca5
DD
5342 if (mangled_name == NULL)
5343 {
74aee4eb
DD
5344 if (status != NULL)
5345 *status = -3;
03d5f569
JM
5346 return NULL;
5347 }
03d5f569 5348
d00edca5 5349 if (output_buffer != NULL && length == NULL)
03d5f569 5350 {
74aee4eb
DD
5351 if (status != NULL)
5352 *status = -3;
d00edca5 5353 return NULL;
03d5f569 5354 }
d00edca5 5355
74aee4eb 5356 demangled = d_demangle (mangled_name, DMGL_PARAMS | DMGL_TYPES, &alc);
d00edca5
DD
5357
5358 if (demangled == NULL)
03d5f569 5359 {
74aee4eb
DD
5360 if (status != NULL)
5361 {
5362 if (alc == 1)
5363 *status = -1;
5364 else
5365 *status = -2;
5366 }
03d5f569
JM
5367 return NULL;
5368 }
d00edca5
DD
5369
5370 if (output_buffer == NULL)
5371 {
5372 if (length != NULL)
5373 *length = alc;
5374 }
03d5f569 5375 else
03d5f569 5376 {
d00edca5
DD
5377 if (strlen (demangled) < *length)
5378 {
5379 strcpy (output_buffer, demangled);
5380 free (demangled);
5381 demangled = output_buffer;
5382 }
5383 else
5384 {
5385 free (output_buffer);
5386 *length = alc;
5387 }
03d5f569 5388 }
d00edca5 5389
74aee4eb
DD
5390 if (status != NULL)
5391 *status = 0;
d00edca5
DD
5392
5393 return demangled;
03d5f569
JM
5394}
5395
208c1674
DD
5396extern int __gcclibcxx_demangle_callback (const char *,
5397 void (*)
5398 (const char *, size_t, void *),
5399 void *);
5400
5401/* Alternative, allocationless entry point in the C++ runtime library
5402 for performing demangling. MANGLED_NAME is a NUL-terminated character
5403 string containing the name to be demangled.
5404
5405 CALLBACK is a callback function, called with demangled string
5406 segments as demangling progresses; it is called at least once,
5407 but may be called more than once. OPAQUE is a generalized pointer
5408 used as a callback argument.
5409
5410 The return code is one of the following values, equivalent to
5411 the STATUS values of __cxa_demangle() (excluding -1, since this
5412 function performs no memory allocations):
5413 0: The demangling operation succeeded.
5414 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
5415 -3: One of the arguments is invalid.
5416
5417 The demangling is performed using the C++ ABI mangling rules, with
5418 GNU extensions. */
5419
5420int
5421__gcclibcxx_demangle_callback (const char *mangled_name,
5422 void (*callback) (const char *, size_t, void *),
5423 void *opaque)
5424{
5425 int status;
5426
5427 if (mangled_name == NULL || callback == NULL)
5428 return -3;
5429
5430 status = d_demangle_callback (mangled_name, DMGL_PARAMS | DMGL_TYPES,
5431 callback, opaque);
5432 if (status == 0)
5433 return -2;
5434
5435 return 0;
5436}
5437
0c4460bb 5438#else /* ! (IN_LIBGCC2 || IN_GLIBCPP_V3) */
03d5f569 5439
d00edca5
DD
5440/* Entry point for libiberty demangler. If MANGLED is a g++ v3 ABI
5441 mangled name, return a buffer allocated with malloc holding the
5442 demangled name. Otherwise, return NULL. */
eb383413
L
5443
5444char *
208c1674 5445cplus_demangle_v3 (const char *mangled, int options)
eb383413 5446{
d00edca5 5447 size_t alc;
849ee224 5448
d00edca5 5449 return d_demangle (mangled, options, &alc);
eb383413
L
5450}
5451
208c1674
DD
5452int
5453cplus_demangle_v3_callback (const char *mangled, int options,
5454 demangle_callbackref callback, void *opaque)
5455{
5456 return d_demangle_callback (mangled, options, callback, opaque);
5457}
5458
bc9bf259
DD
5459/* Demangle a Java symbol. Java uses a subset of the V3 ABI C++ mangling
5460 conventions, but the output formatting is a little different.
208c1674
DD
5461 This instructs the C++ demangler not to emit pointer characters ("*"), to
5462 use Java's namespace separator symbol ("." instead of "::"), and to output
5463 JArray<TYPE> as TYPE[]. */
bc9bf259
DD
5464
5465char *
208c1674 5466java_demangle_v3 (const char *mangled)
bc9bf259 5467{
d00edca5 5468 size_t alc;
bc9bf259 5469
208c1674
DD
5470 return d_demangle (mangled, DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX, &alc);
5471}
f2160d2b 5472
208c1674
DD
5473int
5474java_demangle_v3_callback (const char *mangled,
5475 demangle_callbackref callback, void *opaque)
5476{
5477 return d_demangle_callback (mangled,
5478 DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX,
5479 callback, opaque);
bc9bf259
DD
5480}
5481
0c4460bb 5482#endif /* IN_LIBGCC2 || IN_GLIBCPP_V3 */
03d5f569 5483
2a9dffbf 5484#ifndef IN_GLIBCPP_V3
d00edca5
DD
5485
5486/* Demangle a string in order to find out whether it is a constructor
5487 or destructor. Return non-zero on success. Set *CTOR_KIND and
5488 *DTOR_KIND appropriately. */
5489
5490static int
9334f9c6
DD
5491is_ctor_or_dtor (const char *mangled,
5492 enum gnu_v3_ctor_kinds *ctor_kind,
5493 enum gnu_v3_dtor_kinds *dtor_kind)
e61231f1 5494{
d00edca5 5495 struct d_info di;
59727473 5496 struct demangle_component *dc;
858b45cf 5497 int ret;
e61231f1 5498
d00edca5
DD
5499 *ctor_kind = (enum gnu_v3_ctor_kinds) 0;
5500 *dtor_kind = (enum gnu_v3_dtor_kinds) 0;
5501
59727473 5502 cplus_demangle_init_info (mangled, DMGL_GNU_V3, strlen (mangled), &di);
e61231f1 5503
b6fb00c0
DD
5504 {
5505#ifdef CP_DYNAMIC_ARRAYS
59727473
DD
5506 __extension__ struct demangle_component comps[di.num_comps];
5507 __extension__ struct demangle_component *subs[di.num_subs];
b6fb00c0 5508
208c1674
DD
5509 di.comps = comps;
5510 di.subs = subs;
b6fb00c0 5511#else
208c1674
DD
5512 di.comps = alloca (di.num_comps * sizeof (*di.comps));
5513 di.subs = alloca (di.num_subs * sizeof (*di.subs));
b6fb00c0 5514#endif
d00edca5 5515
59727473 5516 dc = cplus_demangle_mangled_name (&di, 1);
d35d0cd4 5517
b6fb00c0
DD
5518 /* Note that because we did not pass DMGL_PARAMS, we don't expect
5519 to demangle the entire string. */
e61231f1 5520
b6fb00c0
DD
5521 ret = 0;
5522 while (dc != NULL)
5523 {
5524 switch (dc->type)
5525 {
5526 default:
5527 dc = NULL;
5528 break;
59727473
DD
5529 case DEMANGLE_COMPONENT_TYPED_NAME:
5530 case DEMANGLE_COMPONENT_TEMPLATE:
5531 case DEMANGLE_COMPONENT_RESTRICT_THIS:
5532 case DEMANGLE_COMPONENT_VOLATILE_THIS:
5533 case DEMANGLE_COMPONENT_CONST_THIS:
b6fb00c0
DD
5534 dc = d_left (dc);
5535 break;
59727473
DD
5536 case DEMANGLE_COMPONENT_QUAL_NAME:
5537 case DEMANGLE_COMPONENT_LOCAL_NAME:
b6fb00c0
DD
5538 dc = d_right (dc);
5539 break;
59727473 5540 case DEMANGLE_COMPONENT_CTOR:
b6fb00c0
DD
5541 *ctor_kind = dc->u.s_ctor.kind;
5542 ret = 1;
5543 dc = NULL;
5544 break;
59727473 5545 case DEMANGLE_COMPONENT_DTOR:
b6fb00c0
DD
5546 *dtor_kind = dc->u.s_dtor.kind;
5547 ret = 1;
5548 dc = NULL;
5549 break;
5550 }
5551 }
b6fb00c0 5552 }
858b45cf
DD
5553
5554 return ret;
e61231f1
JB
5555}
5556
d00edca5
DD
5557/* Return whether NAME is the mangled form of a g++ V3 ABI constructor
5558 name. A non-zero return indicates the type of constructor. */
e61231f1 5559
e61231f1 5560enum gnu_v3_ctor_kinds
9334f9c6 5561is_gnu_v3_mangled_ctor (const char *name)
e61231f1 5562{
d00edca5
DD
5563 enum gnu_v3_ctor_kinds ctor_kind;
5564 enum gnu_v3_dtor_kinds dtor_kind;
e61231f1 5565
d00edca5 5566 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
585cc78f 5567 return (enum gnu_v3_ctor_kinds) 0;
d00edca5 5568 return ctor_kind;
e61231f1
JB
5569}
5570
5571
d00edca5
DD
5572/* Return whether NAME is the mangled form of a g++ V3 ABI destructor
5573 name. A non-zero return indicates the type of destructor. */
5574
e61231f1 5575enum gnu_v3_dtor_kinds
9334f9c6 5576is_gnu_v3_mangled_dtor (const char *name)
e61231f1 5577{
d00edca5
DD
5578 enum gnu_v3_ctor_kinds ctor_kind;
5579 enum gnu_v3_dtor_kinds dtor_kind;
e61231f1 5580
d00edca5 5581 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
585cc78f 5582 return (enum gnu_v3_dtor_kinds) 0;
d00edca5 5583 return dtor_kind;
e61231f1
JB
5584}
5585
d00edca5 5586#endif /* IN_GLIBCPP_V3 */
e61231f1 5587
eb383413
L
5588#ifdef STANDALONE_DEMANGLER
5589
5590#include "getopt.h"
d00edca5
DD
5591#include "dyn-string.h"
5592
e064c173 5593static void print_usage (FILE* fp, int exit_value);
eb383413 5594
d00edca5
DD
5595#define IS_ALPHA(CHAR) \
5596 (((CHAR) >= 'a' && (CHAR) <= 'z') \
5597 || ((CHAR) >= 'A' && (CHAR) <= 'Z'))
eb383413
L
5598
5599/* Non-zero if CHAR is a character than can occur in a mangled name. */
5600#define is_mangled_char(CHAR) \
74bcd529
DD
5601 (IS_ALPHA (CHAR) || IS_DIGIT (CHAR) \
5602 || (CHAR) == '_' || (CHAR) == '.' || (CHAR) == '$')
eb383413
L
5603
5604/* The name of this program, as invoked. */
5605const char* program_name;
5606
5607/* Prints usage summary to FP and then exits with EXIT_VALUE. */
5608
5609static void
9334f9c6 5610print_usage (FILE* fp, int exit_value)
eb383413
L
5611{
5612 fprintf (fp, "Usage: %s [options] [names ...]\n", program_name);
74bcd529 5613 fprintf (fp, "Options:\n");
eb383413 5614 fprintf (fp, " -h,--help Display this message.\n");
6d95373e 5615 fprintf (fp, " -p,--no-params Don't display function parameters\n");
eb383413
L
5616 fprintf (fp, " -v,--verbose Produce verbose demanglings.\n");
5617 fprintf (fp, "If names are provided, they are demangled. Otherwise filters standard input.\n");
5618
5619 exit (exit_value);
5620}
5621
5622/* Option specification for getopt_long. */
c23795e2 5623static const struct option long_options[] =
eb383413 5624{
6d95373e
DD
5625 { "help", no_argument, NULL, 'h' },
5626 { "no-params", no_argument, NULL, 'p' },
5627 { "verbose", no_argument, NULL, 'v' },
5628 { NULL, no_argument, NULL, 0 },
eb383413
L
5629};
5630
5631/* Main entry for a demangling filter executable. It will demangle
5632 its command line arguments, if any. If none are provided, it will
5633 filter stdin to stdout, replacing any recognized mangled C++ names
5634 with their demangled equivalents. */
5635
5636int
9334f9c6 5637main (int argc, char *argv[])
eb383413 5638{
eb383413
L
5639 int i;
5640 int opt_char;
d00edca5 5641 int options = DMGL_PARAMS | DMGL_ANSI | DMGL_TYPES;
eb383413
L
5642
5643 /* Use the program name of this program, as invoked. */
5644 program_name = argv[0];
5645
5646 /* Parse options. */
5647 do
5648 {
6d95373e 5649 opt_char = getopt_long (argc, argv, "hpv", long_options, NULL);
eb383413
L
5650 switch (opt_char)
5651 {
5652 case '?': /* Unrecognized option. */
5653 print_usage (stderr, 1);
5654 break;
5655
5656 case 'h':
5657 print_usage (stdout, 0);
5658 break;
5659
6d95373e
DD
5660 case 'p':
5661 options &= ~ DMGL_PARAMS;
5662 break;
5663
eb383413 5664 case 'v':
d00edca5 5665 options |= DMGL_VERBOSE;
eb383413
L
5666 break;
5667 }
5668 }
5669 while (opt_char != -1);
5670
5671 if (optind == argc)
5672 /* No command line arguments were provided. Filter stdin. */
5673 {
5674 dyn_string_t mangled = dyn_string_new (3);
d00edca5 5675 char *s;
eb383413
L
5676
5677 /* Read all of input. */
5678 while (!feof (stdin))
5679 {
d00edca5 5680 char c;
eb383413
L
5681
5682 /* Pile characters into mangled until we hit one that can't
5683 occur in a mangled name. */
5684 c = getchar ();
5685 while (!feof (stdin) && is_mangled_char (c))
5686 {
5687 dyn_string_append_char (mangled, c);
5688 if (feof (stdin))
5689 break;
5690 c = getchar ();
5691 }
5692
d00edca5 5693 if (dyn_string_length (mangled) > 0)
03d5f569 5694 {
74aee4eb
DD
5695#ifdef IN_GLIBCPP_V3
5696 s = __cxa_demangle (dyn_string_buf (mangled), NULL, NULL, NULL);
5697#else
d00edca5 5698 s = cplus_demangle_v3 (dyn_string_buf (mangled), options);
74aee4eb 5699#endif
d00edca5
DD
5700
5701 if (s != NULL)
5702 {
5703 fputs (s, stdout);
5704 free (s);
5705 }
5706 else
5707 {
5708 /* It might not have been a mangled name. Print the
5709 original text. */
5710 fputs (dyn_string_buf (mangled), stdout);
5711 }
5712
5713 dyn_string_clear (mangled);
03d5f569 5714 }
eb383413
L
5715
5716 /* If we haven't hit EOF yet, we've read one character that
5717 can't occur in a mangled name, so print it out. */
5718 if (!feof (stdin))
5719 putchar (c);
eb383413
L
5720 }
5721
5722 dyn_string_delete (mangled);
eb383413
L
5723 }
5724 else
5725 /* Demangle command line arguments. */
5726 {
eb383413
L
5727 /* Loop over command line arguments. */
5728 for (i = optind; i < argc; ++i)
5729 {
d00edca5 5730 char *s;
74aee4eb
DD
5731#ifdef IN_GLIBCPP_V3
5732 int status;
5733#endif
d00edca5 5734
eb383413 5735 /* Attempt to demangle. */
74aee4eb
DD
5736#ifdef IN_GLIBCPP_V3
5737 s = __cxa_demangle (argv[i], NULL, NULL, &status);
5738#else
d00edca5 5739 s = cplus_demangle_v3 (argv[i], options);
74aee4eb 5740#endif
eb383413
L
5741
5742 /* If it worked, print the demangled name. */
d00edca5 5743 if (s != NULL)
03d5f569 5744 {
d00edca5
DD
5745 printf ("%s\n", s);
5746 free (s);
03d5f569 5747 }
d00edca5 5748 else
74aee4eb
DD
5749 {
5750#ifdef IN_GLIBCPP_V3
5751 fprintf (stderr, "Failed: %s (status %d)\n", argv[i], status);
5752#else
5753 fprintf (stderr, "Failed: %s\n", argv[i]);
5754#endif
5755 }
eb383413 5756 }
eb383413
L
5757 }
5758
5759 return 0;
5760}
5761
5762#endif /* STANDALONE_DEMANGLER */
This page took 0.942235 seconds and 4 git commands to generate.