]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - libiberty/cp-demangle.c
2012-04-02 Tristan Gingold <gingold@adacore.com>
[thirdparty/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 },
ba8cb4ba 1585 { "cl", NL ("()"), 2 },
b6fb00c0
DD
1586 { "cm", NL (","), 2 },
1587 { "co", NL ("~"), 1 },
1588 { "dV", NL ("/="), 2 },
eb7b5ddb 1589 { "da", NL ("delete[] "), 1 },
b6fb00c0 1590 { "de", NL ("*"), 1 },
eb7b5ddb
DD
1591 { "dl", NL ("delete "), 1 },
1592 { "ds", NL (".*"), 2 },
1c08f2c8 1593 { "dt", NL ("."), 2 },
b6fb00c0
DD
1594 { "dv", NL ("/"), 2 },
1595 { "eO", NL ("^="), 2 },
1596 { "eo", NL ("^"), 2 },
1597 { "eq", NL ("=="), 2 },
1598 { "ge", NL (">="), 2 },
eb7b5ddb 1599 { "gs", NL ("::"), 1 },
b6fb00c0
DD
1600 { "gt", NL (">"), 2 },
1601 { "ix", NL ("[]"), 2 },
1602 { "lS", NL ("<<="), 2 },
1603 { "le", NL ("<="), 2 },
4e3aa408 1604 { "li", NL ("operator\"\" "), 1 },
b6fb00c0
DD
1605 { "ls", NL ("<<"), 2 },
1606 { "lt", NL ("<"), 2 },
1607 { "mI", NL ("-="), 2 },
1608 { "mL", NL ("*="), 2 },
1609 { "mi", NL ("-"), 2 },
1610 { "ml", NL ("*"), 2 },
1611 { "mm", NL ("--"), 1 },
eb7b5ddb 1612 { "na", NL ("new[]"), 3 },
b6fb00c0
DD
1613 { "ne", NL ("!="), 2 },
1614 { "ng", NL ("-"), 1 },
1615 { "nt", NL ("!"), 1 },
eb7b5ddb 1616 { "nw", NL ("new"), 3 },
b6fb00c0
DD
1617 { "oR", NL ("|="), 2 },
1618 { "oo", NL ("||"), 2 },
1619 { "or", NL ("|"), 2 },
1620 { "pL", NL ("+="), 2 },
1621 { "pl", NL ("+"), 2 },
1622 { "pm", NL ("->*"), 2 },
1623 { "pp", NL ("++"), 1 },
1624 { "ps", NL ("+"), 1 },
1625 { "pt", NL ("->"), 2 },
1626 { "qu", NL ("?"), 3 },
1627 { "rM", NL ("%="), 2 },
1628 { "rS", NL (">>="), 2 },
1629 { "rm", NL ("%"), 2 },
1630 { "rs", NL (">>"), 2 },
1631 { "st", NL ("sizeof "), 1 },
59727473 1632 { "sz", NL ("sizeof "), 1 },
eb7b5ddb
DD
1633 { "tr", NL ("throw"), 0 },
1634 { "tw", NL ("throw "), 1 },
59727473 1635 { NULL, NULL, 0, 0 }
d00edca5 1636};
eb383413 1637
59727473 1638static struct demangle_component *
9334f9c6 1639d_operator_name (struct d_info *di)
eb383413 1640{
d00edca5
DD
1641 char c1;
1642 char c2;
eb383413 1643
d00edca5
DD
1644 c1 = d_next_char (di);
1645 c2 = d_next_char (di);
1646 if (c1 == 'v' && IS_DIGIT (c2))
1647 return d_make_extended_operator (di, c2 - '0', d_source_name (di));
1648 else if (c1 == 'c' && c2 == 'v')
59727473
DD
1649 return d_make_comp (di, DEMANGLE_COMPONENT_CAST,
1650 cplus_demangle_type (di), NULL);
d00edca5 1651 else
eb383413 1652 {
59727473 1653 /* LOW is the inclusive lower bound. */
d00edca5 1654 int low = 0;
59727473
DD
1655 /* HIGH is the exclusive upper bound. We subtract one to ignore
1656 the sentinel at the end of the array. */
1657 int high = ((sizeof (cplus_demangle_operators)
1658 / sizeof (cplus_demangle_operators[0]))
1659 - 1);
eb383413 1660
d00edca5
DD
1661 while (1)
1662 {
1663 int i;
59727473 1664 const struct demangle_operator_info *p;
eb383413 1665
d00edca5 1666 i = low + (high - low) / 2;
59727473 1667 p = cplus_demangle_operators + i;
eb383413 1668
d00edca5
DD
1669 if (c1 == p->code[0] && c2 == p->code[1])
1670 return d_make_operator (di, p);
1671
1672 if (c1 < p->code[0] || (c1 == p->code[0] && c2 < p->code[1]))
1673 high = i;
1674 else
1675 low = i + 1;
1676 if (low == high)
1677 return NULL;
1678 }
1679 }
eb383413
L
1680}
1681
830ef634
DD
1682static struct demangle_component *
1683d_make_character (struct d_info *di, int c)
1684{
1685 struct demangle_component *p;
1686 p = d_make_empty (di);
1687 if (p != NULL)
1688 {
1689 p->type = DEMANGLE_COMPONENT_CHARACTER;
1690 p->u.s_character.character = c;
1691 }
1692 return p;
1693}
1694
1695static struct demangle_component *
1696d_java_resource (struct d_info *di)
1697{
1698 struct demangle_component *p = NULL;
1699 struct demangle_component *next = NULL;
1700 long len, i;
1701 char c;
1702 const char *str;
1703
1704 len = d_number (di);
1705 if (len <= 1)
1706 return NULL;
1707
1708 /* Eat the leading '_'. */
1709 if (d_next_char (di) != '_')
1710 return NULL;
1711 len--;
1712
1713 str = d_str (di);
1714 i = 0;
1715
1716 while (len > 0)
1717 {
1718 c = str[i];
1719 if (!c)
1720 return NULL;
1721
1722 /* Each chunk is either a '$' escape... */
1723 if (c == '$')
1724 {
1725 i++;
1726 switch (str[i++])
1727 {
1728 case 'S':
1729 c = '/';
1730 break;
1731 case '_':
1732 c = '.';
1733 break;
1734 case '$':
1735 c = '$';
1736 break;
1737 default:
1738 return NULL;
1739 }
1740 next = d_make_character (di, c);
1741 d_advance (di, i);
1742 str = d_str (di);
1743 len -= i;
1744 i = 0;
1745 if (next == NULL)
1746 return NULL;
1747 }
1748 /* ... or a sequence of characters. */
1749 else
1750 {
1751 while (i < len && str[i] && str[i] != '$')
1752 i++;
1753
1754 next = d_make_name (di, str, i);
1755 d_advance (di, i);
1756 str = d_str (di);
1757 len -= i;
1758 i = 0;
1759 if (next == NULL)
1760 return NULL;
1761 }
1762
1763 if (p == NULL)
1764 p = next;
1765 else
1766 {
1767 p = d_make_comp (di, DEMANGLE_COMPONENT_COMPOUND_NAME, p, next);
1768 if (p == NULL)
1769 return NULL;
1770 }
1771 }
1772
1773 p = d_make_comp (di, DEMANGLE_COMPONENT_JAVA_RESOURCE, p, NULL);
1774
1775 return p;
1776}
1777
d00edca5
DD
1778/* <special-name> ::= TV <type>
1779 ::= TT <type>
1780 ::= TI <type>
1781 ::= TS <type>
1782 ::= GV <(object) name>
1783 ::= T <call-offset> <(base) encoding>
1784 ::= Tc <call-offset> <call-offset> <(base) encoding>
1785 Also g++ extensions:
1786 ::= TC <type> <(offset) number> _ <(base) type>
1787 ::= TF <type>
1788 ::= TJ <type>
1789 ::= GR <name>
839e4798 1790 ::= GA <encoding>
830ef634 1791 ::= Gr <resource name>
956a8f8b
DD
1792 ::= GTt <encoding>
1793 ::= GTn <encoding>
d00edca5 1794*/
eb383413 1795
59727473 1796static struct demangle_component *
9334f9c6 1797d_special_name (struct d_info *di)
eb383413 1798{
b6fb00c0 1799 di->expansion += 20;
6ef6358e 1800 if (d_check_char (di, 'T'))
03d5f569 1801 {
d00edca5
DD
1802 switch (d_next_char (di))
1803 {
1804 case 'V':
b6fb00c0 1805 di->expansion -= 5;
59727473
DD
1806 return d_make_comp (di, DEMANGLE_COMPONENT_VTABLE,
1807 cplus_demangle_type (di), NULL);
d00edca5 1808 case 'T':
b6fb00c0 1809 di->expansion -= 10;
59727473
DD
1810 return d_make_comp (di, DEMANGLE_COMPONENT_VTT,
1811 cplus_demangle_type (di), NULL);
d00edca5 1812 case 'I':
59727473
DD
1813 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO,
1814 cplus_demangle_type (di), NULL);
d00edca5 1815 case 'S':
59727473
DD
1816 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_NAME,
1817 cplus_demangle_type (di), NULL);
eb383413 1818
d00edca5
DD
1819 case 'h':
1820 if (! d_call_offset (di, 'h'))
1821 return NULL;
59727473
DD
1822 return d_make_comp (di, DEMANGLE_COMPONENT_THUNK,
1823 d_encoding (di, 0), NULL);
eb383413 1824
d00edca5
DD
1825 case 'v':
1826 if (! d_call_offset (di, 'v'))
1827 return NULL;
59727473
DD
1828 return d_make_comp (di, DEMANGLE_COMPONENT_VIRTUAL_THUNK,
1829 d_encoding (di, 0), NULL);
eb383413 1830
d00edca5
DD
1831 case 'c':
1832 if (! d_call_offset (di, '\0'))
1833 return NULL;
1834 if (! d_call_offset (di, '\0'))
1835 return NULL;
59727473
DD
1836 return d_make_comp (di, DEMANGLE_COMPONENT_COVARIANT_THUNK,
1837 d_encoding (di, 0), NULL);
eb383413 1838
d00edca5
DD
1839 case 'C':
1840 {
59727473 1841 struct demangle_component *derived_type;
d00edca5 1842 long offset;
59727473 1843 struct demangle_component *base_type;
d00edca5 1844
59727473 1845 derived_type = cplus_demangle_type (di);
d00edca5
DD
1846 offset = d_number (di);
1847 if (offset < 0)
1848 return NULL;
6ef6358e 1849 if (! d_check_char (di, '_'))
d00edca5 1850 return NULL;
59727473 1851 base_type = cplus_demangle_type (di);
d00edca5
DD
1852 /* We don't display the offset. FIXME: We should display
1853 it in verbose mode. */
b6fb00c0 1854 di->expansion += 5;
59727473
DD
1855 return d_make_comp (di, DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE,
1856 base_type, derived_type);
d00edca5 1857 }
eb383413 1858
d00edca5 1859 case 'F':
59727473
DD
1860 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_FN,
1861 cplus_demangle_type (di), NULL);
d00edca5 1862 case 'J':
59727473
DD
1863 return d_make_comp (di, DEMANGLE_COMPONENT_JAVA_CLASS,
1864 cplus_demangle_type (di), NULL);
eb383413 1865
d00edca5
DD
1866 default:
1867 return NULL;
1868 }
eb383413 1869 }
6ef6358e 1870 else if (d_check_char (di, 'G'))
eb383413 1871 {
d00edca5
DD
1872 switch (d_next_char (di))
1873 {
1874 case 'V':
59727473 1875 return d_make_comp (di, DEMANGLE_COMPONENT_GUARD, d_name (di), NULL);
d00edca5
DD
1876
1877 case 'R':
abc6552b
DD
1878 {
1879 struct demangle_component *name = d_name (di);
1880 return d_make_comp (di, DEMANGLE_COMPONENT_REFTEMP, name,
1881 d_number_component (di));
1882 }
d00edca5 1883
839e4798
RH
1884 case 'A':
1885 return d_make_comp (di, DEMANGLE_COMPONENT_HIDDEN_ALIAS,
1886 d_encoding (di, 0), NULL);
1887
956a8f8b
DD
1888 case 'T':
1889 switch (d_next_char (di))
1890 {
1891 case 'n':
1892 return d_make_comp (di, DEMANGLE_COMPONENT_NONTRANSACTION_CLONE,
1893 d_encoding (di, 0), NULL);
1894 default:
1895 /* ??? The proposal is that other letters (such as 'h') stand
1896 for different variants of transaction cloning, such as
1897 compiling directly for hardware transaction support. But
1898 they still should all be transactional clones of some sort
1899 so go ahead and call them that. */
1900 case 't':
1901 return d_make_comp (di, DEMANGLE_COMPONENT_TRANSACTION_CLONE,
1902 d_encoding (di, 0), NULL);
1903 }
1904
830ef634
DD
1905 case 'r':
1906 return d_java_resource (di);
1907
d00edca5
DD
1908 default:
1909 return NULL;
1910 }
eb383413 1911 }
d00edca5
DD
1912 else
1913 return NULL;
eb383413
L
1914}
1915
d00edca5
DD
1916/* <call-offset> ::= h <nv-offset> _
1917 ::= v <v-offset> _
eb383413 1918
d00edca5 1919 <nv-offset> ::= <(offset) number>
eb383413 1920
d00edca5 1921 <v-offset> ::= <(offset) number> _ <(virtual offset) number>
eb383413 1922
d00edca5
DD
1923 The C parameter, if not '\0', is a character we just read which is
1924 the start of the <call-offset>.
eb383413 1925
d00edca5
DD
1926 We don't display the offset information anywhere. FIXME: We should
1927 display it in verbose mode. */
eb383413 1928
d00edca5 1929static int
9334f9c6 1930d_call_offset (struct d_info *di, int c)
eb383413 1931{
d00edca5
DD
1932 if (c == '\0')
1933 c = d_next_char (di);
eb383413 1934
d00edca5 1935 if (c == 'h')
eb129e35 1936 d_number (di);
d00edca5 1937 else if (c == 'v')
eb383413 1938 {
eb129e35 1939 d_number (di);
6ef6358e 1940 if (! d_check_char (di, '_'))
d00edca5 1941 return 0;
eb129e35 1942 d_number (di);
eb383413 1943 }
d00edca5
DD
1944 else
1945 return 0;
eb383413 1946
6ef6358e 1947 if (! d_check_char (di, '_'))
d00edca5 1948 return 0;
eb383413 1949
d00edca5 1950 return 1;
eb383413
L
1951}
1952
d00edca5
DD
1953/* <ctor-dtor-name> ::= C1
1954 ::= C2
1955 ::= C3
1956 ::= D0
1957 ::= D1
1958 ::= D2
1959*/
1960
59727473 1961static struct demangle_component *
9334f9c6 1962d_ctor_dtor_name (struct d_info *di)
d00edca5 1963{
b6fb00c0
DD
1964 if (di->last_name != NULL)
1965 {
59727473 1966 if (di->last_name->type == DEMANGLE_COMPONENT_NAME)
b6fb00c0 1967 di->expansion += di->last_name->u.s_name.len;
59727473 1968 else if (di->last_name->type == DEMANGLE_COMPONENT_SUB_STD)
b6fb00c0
DD
1969 di->expansion += di->last_name->u.s_string.len;
1970 }
6ef6358e 1971 switch (d_peek_char (di))
d00edca5
DD
1972 {
1973 case 'C':
1974 {
1975 enum gnu_v3_ctor_kinds kind;
1976
6ef6358e 1977 switch (d_peek_next_char (di))
d00edca5
DD
1978 {
1979 case '1':
1980 kind = gnu_v3_complete_object_ctor;
1981 break;
1982 case '2':
1983 kind = gnu_v3_base_object_ctor;
1984 break;
1985 case '3':
1986 kind = gnu_v3_complete_object_allocating_ctor;
1987 break;
956a8f8b
DD
1988 case '5':
1989 kind = gnu_v3_object_ctor_group;
1990 break;
d00edca5
DD
1991 default:
1992 return NULL;
1993 }
6ef6358e 1994 d_advance (di, 2);
d00edca5
DD
1995 return d_make_ctor (di, kind, di->last_name);
1996 }
1997
1998 case 'D':
1999 {
2000 enum gnu_v3_dtor_kinds kind;
2001
6ef6358e 2002 switch (d_peek_next_char (di))
d00edca5
DD
2003 {
2004 case '0':
2005 kind = gnu_v3_deleting_dtor;
2006 break;
2007 case '1':
2008 kind = gnu_v3_complete_object_dtor;
2009 break;
2010 case '2':
2011 kind = gnu_v3_base_object_dtor;
2012 break;
956a8f8b
DD
2013 case '5':
2014 kind = gnu_v3_object_dtor_group;
2015 break;
d00edca5
DD
2016 default:
2017 return NULL;
2018 }
6ef6358e 2019 d_advance (di, 2);
d00edca5
DD
2020 return d_make_dtor (di, kind, di->last_name);
2021 }
eb383413 2022
d00edca5
DD
2023 default:
2024 return NULL;
2025 }
2026}
eb383413 2027
d00edca5
DD
2028/* <type> ::= <builtin-type>
2029 ::= <function-type>
2030 ::= <class-enum-type>
2031 ::= <array-type>
2032 ::= <pointer-to-member-type>
2033 ::= <template-param>
2034 ::= <template-template-param> <template-args>
2035 ::= <substitution>
2036 ::= <CV-qualifiers> <type>
2037 ::= P <type>
2038 ::= R <type>
8969a67f 2039 ::= O <type> (C++0x)
d00edca5
DD
2040 ::= C <type>
2041 ::= G <type>
2042 ::= U <source-name> <type>
2043
2044 <builtin-type> ::= various one letter codes
2045 ::= u <source-name>
2046*/
eb383413 2047
59727473
DD
2048CP_STATIC_IF_GLIBCPP_V3
2049const struct demangle_builtin_type_info
2050cplus_demangle_builtin_types[D_BUILTIN_TYPE_COUNT] =
d00edca5 2051{
2d733211 2052 /* a */ { NL ("signed char"), NL ("signed char"), D_PRINT_DEFAULT },
b6fb00c0 2053 /* b */ { NL ("bool"), NL ("boolean"), D_PRINT_BOOL },
2d733211
DD
2054 /* c */ { NL ("char"), NL ("byte"), D_PRINT_DEFAULT },
2055 /* d */ { NL ("double"), NL ("double"), D_PRINT_FLOAT },
2056 /* e */ { NL ("long double"), NL ("long double"), D_PRINT_FLOAT },
2057 /* f */ { NL ("float"), NL ("float"), D_PRINT_FLOAT },
2058 /* g */ { NL ("__float128"), NL ("__float128"), D_PRINT_FLOAT },
2059 /* h */ { NL ("unsigned char"), NL ("unsigned char"), D_PRINT_DEFAULT },
b6fb00c0 2060 /* i */ { NL ("int"), NL ("int"), D_PRINT_INT },
2d733211 2061 /* j */ { NL ("unsigned int"), NL ("unsigned"), D_PRINT_UNSIGNED },
b6fb00c0
DD
2062 /* k */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2063 /* l */ { NL ("long"), NL ("long"), D_PRINT_LONG },
2d733211 2064 /* m */ { NL ("unsigned long"), NL ("unsigned long"), D_PRINT_UNSIGNED_LONG },
b6fb00c0 2065 /* n */ { NL ("__int128"), NL ("__int128"), D_PRINT_DEFAULT },
2d733211
DD
2066 /* o */ { NL ("unsigned __int128"), NL ("unsigned __int128"),
2067 D_PRINT_DEFAULT },
1c08f2c8
DD
2068 /* p */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2069 /* q */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2070 /* r */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2d733211
DD
2071 /* s */ { NL ("short"), NL ("short"), D_PRINT_DEFAULT },
2072 /* t */ { NL ("unsigned short"), NL ("unsigned short"), D_PRINT_DEFAULT },
1c08f2c8 2073 /* u */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
b6fb00c0 2074 /* v */ { NL ("void"), NL ("void"), D_PRINT_VOID },
2d733211
DD
2075 /* w */ { NL ("wchar_t"), NL ("char"), D_PRINT_DEFAULT },
2076 /* x */ { NL ("long long"), NL ("long"), D_PRINT_LONG_LONG },
2077 /* y */ { NL ("unsigned long long"), NL ("unsigned long long"),
2078 D_PRINT_UNSIGNED_LONG_LONG },
b6fb00c0 2079 /* z */ { NL ("..."), NL ("..."), D_PRINT_DEFAULT },
1c08f2c8
DD
2080 /* 26 */ { NL ("decimal32"), NL ("decimal32"), D_PRINT_DEFAULT },
2081 /* 27 */ { NL ("decimal64"), NL ("decimal64"), D_PRINT_DEFAULT },
2082 /* 28 */ { NL ("decimal128"), NL ("decimal128"), D_PRINT_DEFAULT },
2083 /* 29 */ { NL ("half"), NL ("half"), D_PRINT_FLOAT },
2084 /* 30 */ { NL ("char16_t"), NL ("char16_t"), D_PRINT_DEFAULT },
2085 /* 31 */ { NL ("char32_t"), NL ("char32_t"), D_PRINT_DEFAULT },
cf383746
DD
2086 /* 32 */ { NL ("decltype(nullptr)"), NL ("decltype(nullptr)"),
2087 D_PRINT_DEFAULT },
d00edca5 2088};
eb383413 2089
59727473
DD
2090CP_STATIC_IF_GLIBCPP_V3
2091struct demangle_component *
9334f9c6 2092cplus_demangle_type (struct d_info *di)
eb383413 2093{
d00edca5 2094 char peek;
59727473 2095 struct demangle_component *ret;
d00edca5
DD
2096 int can_subst;
2097
2098 /* The ABI specifies that when CV-qualifiers are used, the base type
2099 is substitutable, and the fully qualified type is substitutable,
2100 but the base type with a strict subset of the CV-qualifiers is
2101 not substitutable. The natural recursive implementation of the
2102 CV-qualifiers would cause subsets to be substitutable, so instead
2103 we pull them all off now.
2104
331c3da2
DD
2105 FIXME: The ABI says that order-insensitive vendor qualifiers
2106 should be handled in the same way, but we have no way to tell
2107 which vendor qualifiers are order-insensitive and which are
2108 order-sensitive. So we just assume that they are all
2109 order-sensitive. g++ 3.4 supports only one vendor qualifier,
2110 __vector, and it treats it as order-sensitive when mangling
2111 names. */
d00edca5
DD
2112
2113 peek = d_peek_char (di);
2114 if (peek == 'r' || peek == 'V' || peek == 'K')
2115 {
59727473 2116 struct demangle_component **pret;
74bcd529 2117
858b45cf 2118 pret = d_cv_qualifiers (di, &ret, 0);
331c3da2
DD
2119 if (pret == NULL)
2120 return NULL;
59727473 2121 *pret = cplus_demangle_type (di);
8d301070 2122 if (! *pret || ! d_add_substitution (di, ret))
d00edca5
DD
2123 return NULL;
2124 return ret;
2125 }
eb383413 2126
d00edca5 2127 can_subst = 1;
eb383413 2128
74bcd529 2129 switch (peek)
eb383413 2130 {
d00edca5
DD
2131 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
2132 case 'h': case 'i': case 'j': case 'l': case 'm': case 'n':
2133 case 'o': case 's': case 't':
2134 case 'v': case 'w': case 'x': case 'y': case 'z':
59727473
DD
2135 ret = d_make_builtin_type (di,
2136 &cplus_demangle_builtin_types[peek - 'a']);
b6fb00c0 2137 di->expansion += ret->u.s_builtin.type->len;
d00edca5
DD
2138 can_subst = 0;
2139 d_advance (di, 1);
2140 break;
2141
2142 case 'u':
2143 d_advance (di, 1);
59727473
DD
2144 ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE,
2145 d_source_name (di), NULL);
d00edca5
DD
2146 break;
2147
2148 case 'F':
2149 ret = d_function_type (di);
eb383413
L
2150 break;
2151
d00edca5
DD
2152 case '0': case '1': case '2': case '3': case '4':
2153 case '5': case '6': case '7': case '8': case '9':
2154 case 'N':
eb383413 2155 case 'Z':
d00edca5 2156 ret = d_class_enum_type (di);
eb383413
L
2157 break;
2158
d00edca5
DD
2159 case 'A':
2160 ret = d_array_type (di);
2161 break;
2162
2163 case 'M':
2164 ret = d_pointer_to_member_type (di);
2165 break;
2166
2167 case 'T':
2168 ret = d_template_param (di);
2169 if (d_peek_char (di) == 'I')
03d5f569 2170 {
d00edca5
DD
2171 /* This is <template-template-param> <template-args>. The
2172 <template-template-param> part is a substitution
2173 candidate. */
2174 if (! d_add_substitution (di, ret))
2175 return NULL;
59727473
DD
2176 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2177 d_template_args (di));
03d5f569 2178 }
d00edca5
DD
2179 break;
2180
2181 case 'S':
2182 /* If this is a special substitution, then it is the start of
2183 <class-enum-type>. */
2184 {
2185 char peek_next;
74bcd529 2186
d00edca5
DD
2187 peek_next = d_peek_next_char (di);
2188 if (IS_DIGIT (peek_next)
2189 || peek_next == '_'
858b45cf 2190 || IS_UPPER (peek_next))
d00edca5 2191 {
97ceaf5b 2192 ret = d_substitution (di, 0);
d00edca5
DD
2193 /* The substituted name may have been a template name and
2194 may be followed by tepmlate args. */
2195 if (d_peek_char (di) == 'I')
59727473 2196 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
d00edca5
DD
2197 d_template_args (di));
2198 else
2199 can_subst = 0;
2200 }
2201 else
2202 {
2203 ret = d_class_enum_type (di);
2204 /* If the substitution was a complete type, then it is not
2205 a new substitution candidate. However, if the
2206 substitution was followed by template arguments, then
2207 the whole thing is a substitution candidate. */
59727473 2208 if (ret != NULL && ret->type == DEMANGLE_COMPONENT_SUB_STD)
d00edca5
DD
2209 can_subst = 0;
2210 }
2211 }
eb383413
L
2212 break;
2213
8969a67f
DD
2214 case 'O':
2215 d_advance (di, 1);
2216 ret = d_make_comp (di, DEMANGLE_COMPONENT_RVALUE_REFERENCE,
2217 cplus_demangle_type (di), NULL);
2218 break;
2219
d00edca5
DD
2220 case 'P':
2221 d_advance (di, 1);
59727473
DD
2222 ret = d_make_comp (di, DEMANGLE_COMPONENT_POINTER,
2223 cplus_demangle_type (di), NULL);
d00edca5 2224 break;
eb383413 2225
d00edca5
DD
2226 case 'R':
2227 d_advance (di, 1);
59727473 2228 ret = d_make_comp (di, DEMANGLE_COMPONENT_REFERENCE,
8969a67f 2229 cplus_demangle_type (di), NULL);
d00edca5 2230 break;
eb383413 2231
d00edca5
DD
2232 case 'C':
2233 d_advance (di, 1);
59727473
DD
2234 ret = d_make_comp (di, DEMANGLE_COMPONENT_COMPLEX,
2235 cplus_demangle_type (di), NULL);
d00edca5
DD
2236 break;
2237
2238 case 'G':
2239 d_advance (di, 1);
59727473
DD
2240 ret = d_make_comp (di, DEMANGLE_COMPONENT_IMAGINARY,
2241 cplus_demangle_type (di), NULL);
d00edca5 2242 break;
eb383413 2243
d00edca5
DD
2244 case 'U':
2245 d_advance (di, 1);
2246 ret = d_source_name (di);
59727473
DD
2247 ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL,
2248 cplus_demangle_type (di), ret);
eb383413 2249 break;
d00edca5 2250
ba8cb4ba
DD
2251 case 'D':
2252 can_subst = 0;
2253 d_advance (di, 1);
2254 peek = d_next_char (di);
2255 switch (peek)
2256 {
2257 case 'T':
2258 case 't':
2259 /* decltype (expression) */
2260 ret = d_make_comp (di, DEMANGLE_COMPONENT_DECLTYPE,
2261 d_expression (di), NULL);
2262 if (ret && d_next_char (di) != 'E')
2263 ret = NULL;
eb7b5ddb 2264 can_subst = 1;
ba8cb4ba
DD
2265 break;
2266
2267 case 'p':
2268 /* Pack expansion. */
1c08f2c8
DD
2269 ret = d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION,
2270 cplus_demangle_type (di), NULL);
eb7b5ddb 2271 can_subst = 1;
1c08f2c8 2272 break;
ba8cb4ba
DD
2273
2274 case 'f':
1c08f2c8
DD
2275 /* 32-bit decimal floating point */
2276 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[26]);
ba8cb4ba
DD
2277 di->expansion += ret->u.s_builtin.type->len;
2278 break;
2279 case 'd':
1c08f2c8
DD
2280 /* 64-bit DFP */
2281 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[27]);
ba8cb4ba
DD
2282 di->expansion += ret->u.s_builtin.type->len;
2283 break;
2284 case 'e':
2285 /* 128-bit DFP */
1c08f2c8 2286 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[28]);
ba8cb4ba
DD
2287 di->expansion += ret->u.s_builtin.type->len;
2288 break;
2289 case 'h':
2290 /* 16-bit half-precision FP */
1c08f2c8
DD
2291 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[29]);
2292 di->expansion += ret->u.s_builtin.type->len;
2293 break;
2294 case 's':
2295 /* char16_t */
2296 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[30]);
2297 di->expansion += ret->u.s_builtin.type->len;
2298 break;
2299 case 'i':
2300 /* char32_t */
2301 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[31]);
ba8cb4ba
DD
2302 di->expansion += ret->u.s_builtin.type->len;
2303 break;
d2825c1a
DD
2304
2305 case 'F':
2306 /* Fixed point types. DF<int bits><length><fract bits><sat> */
2307 ret = d_make_empty (di);
2308 ret->type = DEMANGLE_COMPONENT_FIXED_TYPE;
2309 if ((ret->u.s_fixed.accum = IS_DIGIT (d_peek_char (di))))
2310 /* For demangling we don't care about the bits. */
2311 d_number (di);
2312 ret->u.s_fixed.length = cplus_demangle_type (di);
cbc43128
DD
2313 if (ret->u.s_fixed.length == NULL)
2314 return NULL;
d2825c1a
DD
2315 d_number (di);
2316 peek = d_next_char (di);
2317 ret->u.s_fixed.sat = (peek == 's');
2318 break;
60cf58f5 2319
cbc43128
DD
2320 case 'v':
2321 ret = d_vector_type (di);
eb7b5ddb 2322 can_subst = 1;
cbc43128
DD
2323 break;
2324
cf383746
DD
2325 case 'n':
2326 /* decltype(nullptr) */
2327 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[32]);
2328 di->expansion += ret->u.s_builtin.type->len;
2329 break;
2330
60cf58f5
DD
2331 default:
2332 return NULL;
ba8cb4ba
DD
2333 }
2334 break;
2335
d00edca5
DD
2336 default:
2337 return NULL;
eb383413
L
2338 }
2339
d00edca5
DD
2340 if (can_subst)
2341 {
2342 if (! d_add_substitution (di, ret))
2343 return NULL;
2344 }
eb383413 2345
d00edca5
DD
2346 return ret;
2347}
eb383413 2348
d00edca5 2349/* <CV-qualifiers> ::= [r] [V] [K] */
eb383413 2350
59727473 2351static struct demangle_component **
9334f9c6
DD
2352d_cv_qualifiers (struct d_info *di,
2353 struct demangle_component **pret, int member_fn)
eb383413 2354{
f9fb0b2d 2355 struct demangle_component **pstart;
eb383413
L
2356 char peek;
2357
f9fb0b2d 2358 pstart = pret;
d00edca5
DD
2359 peek = d_peek_char (di);
2360 while (peek == 'r' || peek == 'V' || peek == 'K')
eb383413 2361 {
59727473 2362 enum demangle_component_type t;
59666b35 2363
d00edca5
DD
2364 d_advance (di, 1);
2365 if (peek == 'r')
b6fb00c0 2366 {
59727473
DD
2367 t = (member_fn
2368 ? DEMANGLE_COMPONENT_RESTRICT_THIS
2369 : DEMANGLE_COMPONENT_RESTRICT);
b6fb00c0
DD
2370 di->expansion += sizeof "restrict";
2371 }
d00edca5 2372 else if (peek == 'V')
b6fb00c0 2373 {
59727473
DD
2374 t = (member_fn
2375 ? DEMANGLE_COMPONENT_VOLATILE_THIS
2376 : DEMANGLE_COMPONENT_VOLATILE);
b6fb00c0
DD
2377 di->expansion += sizeof "volatile";
2378 }
d00edca5 2379 else
b6fb00c0 2380 {
59727473
DD
2381 t = (member_fn
2382 ? DEMANGLE_COMPONENT_CONST_THIS
2383 : DEMANGLE_COMPONENT_CONST);
b6fb00c0
DD
2384 di->expansion += sizeof "const";
2385 }
eb383413 2386
d00edca5
DD
2387 *pret = d_make_comp (di, t, NULL, NULL);
2388 if (*pret == NULL)
2389 return NULL;
2390 pret = &d_left (*pret);
eb383413 2391
d00edca5
DD
2392 peek = d_peek_char (di);
2393 }
eb383413 2394
f9fb0b2d
DD
2395 if (!member_fn && peek == 'F')
2396 {
2397 while (pstart != pret)
2398 {
2399 switch ((*pstart)->type)
2400 {
2401 case DEMANGLE_COMPONENT_RESTRICT:
2402 (*pstart)->type = DEMANGLE_COMPONENT_RESTRICT_THIS;
2403 break;
2404 case DEMANGLE_COMPONENT_VOLATILE:
2405 (*pstart)->type = DEMANGLE_COMPONENT_VOLATILE_THIS;
2406 break;
2407 case DEMANGLE_COMPONENT_CONST:
2408 (*pstart)->type = DEMANGLE_COMPONENT_CONST_THIS;
2409 break;
2410 default:
2411 break;
2412 }
2413 pstart = &d_left (*pstart);
2414 }
2415 }
2416
d00edca5
DD
2417 return pret;
2418}
eb383413 2419
d00edca5 2420/* <function-type> ::= F [Y] <bare-function-type> E */
eb383413 2421
59727473 2422static struct demangle_component *
9334f9c6 2423d_function_type (struct d_info *di)
eb383413 2424{
59727473 2425 struct demangle_component *ret;
eb383413 2426
6ef6358e 2427 if (! d_check_char (di, 'F'))
d00edca5
DD
2428 return NULL;
2429 if (d_peek_char (di) == 'Y')
2430 {
2431 /* Function has C linkage. We don't print this information.
2432 FIXME: We should print it in verbose mode. */
2433 d_advance (di, 1);
2434 }
2435 ret = d_bare_function_type (di, 1);
6ef6358e 2436 if (! d_check_char (di, 'E'))
d00edca5
DD
2437 return NULL;
2438 return ret;
2439}
74bcd529 2440
664aa91f 2441/* <type>+ */
eb383413 2442
59727473 2443static struct demangle_component *
664aa91f 2444d_parmlist (struct d_info *di)
d00edca5 2445{
59727473
DD
2446 struct demangle_component *tl;
2447 struct demangle_component **ptl;
7887b2ce 2448
d00edca5
DD
2449 tl = NULL;
2450 ptl = &tl;
eb383413
L
2451 while (1)
2452 {
59727473 2453 struct demangle_component *type;
eb383413 2454
664aa91f 2455 char peek = d_peek_char (di);
7955ede5 2456 if (peek == '\0' || peek == 'E' || peek == '.')
d00edca5 2457 break;
59727473 2458 type = cplus_demangle_type (di);
d00edca5
DD
2459 if (type == NULL)
2460 return NULL;
664aa91f
DD
2461 *ptl = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, type, NULL);
2462 if (*ptl == NULL)
2463 return NULL;
2464 ptl = &d_right (*ptl);
eb383413 2465 }
eb383413 2466
d00edca5
DD
2467 /* There should be at least one parameter type besides the optional
2468 return type. A function which takes no arguments will have a
2469 single parameter type void. */
2470 if (tl == NULL)
2471 return NULL;
eb383413 2472
d00edca5
DD
2473 /* If we have a single parameter type void, omit it. */
2474 if (d_right (tl) == NULL
59727473 2475 && d_left (tl)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
d00edca5 2476 && d_left (tl)->u.s_builtin.type->print == D_PRINT_VOID)
b6fb00c0
DD
2477 {
2478 di->expansion -= d_left (tl)->u.s_builtin.type->len;
664aa91f 2479 d_left (tl) = NULL;
b6fb00c0 2480 }
eb383413 2481
664aa91f
DD
2482 return tl;
2483}
2484
2485/* <bare-function-type> ::= [J]<type>+ */
2486
2487static struct demangle_component *
2488d_bare_function_type (struct d_info *di, int has_return_type)
2489{
2490 struct demangle_component *return_type;
2491 struct demangle_component *tl;
2492 char peek;
2493
2494 /* Detect special qualifier indicating that the first argument
2495 is the return type. */
2496 peek = d_peek_char (di);
2497 if (peek == 'J')
2498 {
2499 d_advance (di, 1);
2500 has_return_type = 1;
2501 }
2502
2503 if (has_return_type)
2504 {
2505 return_type = cplus_demangle_type (di);
2506 if (return_type == NULL)
2507 return NULL;
2508 }
2509 else
2510 return_type = NULL;
2511
2512 tl = d_parmlist (di);
2513 if (tl == NULL)
2514 return NULL;
2515
2516 return d_make_comp (di, DEMANGLE_COMPONENT_FUNCTION_TYPE,
2517 return_type, tl);
d00edca5 2518}
eb383413 2519
d00edca5 2520/* <class-enum-type> ::= <name> */
eb383413 2521
59727473 2522static struct demangle_component *
9334f9c6 2523d_class_enum_type (struct d_info *di)
d00edca5
DD
2524{
2525 return d_name (di);
2526}
74bcd529 2527
d00edca5
DD
2528/* <array-type> ::= A <(positive dimension) number> _ <(element) type>
2529 ::= A [<(dimension) expression>] _ <(element) type>
2530*/
74bcd529 2531
59727473 2532static struct demangle_component *
9334f9c6 2533d_array_type (struct d_info *di)
d00edca5
DD
2534{
2535 char peek;
59727473 2536 struct demangle_component *dim;
74bcd529 2537
6ef6358e 2538 if (! d_check_char (di, 'A'))
d00edca5
DD
2539 return NULL;
2540
2541 peek = d_peek_char (di);
2542 if (peek == '_')
2543 dim = NULL;
2544 else if (IS_DIGIT (peek))
74bcd529 2545 {
d00edca5 2546 const char *s;
74bcd529 2547
d00edca5
DD
2548 s = d_str (di);
2549 do
2550 {
2551 d_advance (di, 1);
2552 peek = d_peek_char (di);
2553 }
2554 while (IS_DIGIT (peek));
2555 dim = d_make_name (di, s, d_str (di) - s);
331c3da2
DD
2556 if (dim == NULL)
2557 return NULL;
74bcd529 2558 }
eb383413 2559 else
d00edca5
DD
2560 {
2561 dim = d_expression (di);
2562 if (dim == NULL)
2563 return NULL;
2564 }
eb383413 2565
6ef6358e 2566 if (! d_check_char (di, '_'))
d00edca5 2567 return NULL;
eb383413 2568
59727473
DD
2569 return d_make_comp (di, DEMANGLE_COMPONENT_ARRAY_TYPE, dim,
2570 cplus_demangle_type (di));
d00edca5 2571}
eb383413 2572
cbc43128
DD
2573/* <vector-type> ::= Dv <number> _ <type>
2574 ::= Dv _ <expression> _ <type> */
2575
2576static struct demangle_component *
2577d_vector_type (struct d_info *di)
2578{
2579 char peek;
2580 struct demangle_component *dim;
2581
2582 peek = d_peek_char (di);
2583 if (peek == '_')
2584 {
2585 d_advance (di, 1);
2586 dim = d_expression (di);
2587 }
2588 else
2589 dim = d_number_component (di);
2590
2591 if (dim == NULL)
2592 return NULL;
2593
2594 if (! d_check_char (di, '_'))
2595 return NULL;
2596
2597 return d_make_comp (di, DEMANGLE_COMPONENT_VECTOR_TYPE, dim,
2598 cplus_demangle_type (di));
2599}
2600
d00edca5 2601/* <pointer-to-member-type> ::= M <(class) type> <(member) type> */
eb383413 2602
59727473 2603static struct demangle_component *
9334f9c6 2604d_pointer_to_member_type (struct d_info *di)
eb383413 2605{
59727473
DD
2606 struct demangle_component *cl;
2607 struct demangle_component *mem;
2608 struct demangle_component **pmem;
eb383413 2609
6ef6358e 2610 if (! d_check_char (di, 'M'))
d00edca5 2611 return NULL;
eb383413 2612
59727473 2613 cl = cplus_demangle_type (di);
eb383413 2614
d00edca5
DD
2615 /* The ABI specifies that any type can be a substitution source, and
2616 that M is followed by two types, and that when a CV-qualified
2617 type is seen both the base type and the CV-qualified types are
2618 substitution sources. The ABI also specifies that for a pointer
2619 to a CV-qualified member function, the qualifiers are attached to
2620 the second type. Given the grammar, a plain reading of the ABI
2621 suggests that both the CV-qualified member function and the
2622 non-qualified member function are substitution sources. However,
2623 g++ does not work that way. g++ treats only the CV-qualified
2624 member function as a substitution source. FIXME. So to work
2625 with g++, we need to pull off the CV-qualifiers here, in order to
cb6c09ac
DD
2626 avoid calling add_substitution() in cplus_demangle_type(). But
2627 for a CV-qualified member which is not a function, g++ does
2628 follow the ABI, so we need to handle that case here by calling
2629 d_add_substitution ourselves. */
eb383413 2630
858b45cf 2631 pmem = d_cv_qualifiers (di, &mem, 1);
331c3da2
DD
2632 if (pmem == NULL)
2633 return NULL;
59727473 2634 *pmem = cplus_demangle_type (di);
8d301070
GK
2635 if (*pmem == NULL)
2636 return NULL;
eb383413 2637
cb6c09ac
DD
2638 if (pmem != &mem && (*pmem)->type != DEMANGLE_COMPONENT_FUNCTION_TYPE)
2639 {
2640 if (! d_add_substitution (di, mem))
2641 return NULL;
2642 }
2643
59727473 2644 return d_make_comp (di, DEMANGLE_COMPONENT_PTRMEM_TYPE, cl, mem);
eb383413
L
2645}
2646
664aa91f
DD
2647/* <non-negative number> _ */
2648
2649static long
2650d_compact_number (struct d_info *di)
2651{
2652 long num;
2653 if (d_peek_char (di) == '_')
2654 num = 0;
2655 else if (d_peek_char (di) == 'n')
2656 return -1;
2657 else
2658 num = d_number (di) + 1;
2659
2660 if (! d_check_char (di, '_'))
2661 return -1;
2662 return num;
2663}
2664
d00edca5
DD
2665/* <template-param> ::= T_
2666 ::= T <(parameter-2 non-negative) number> _
2667*/
eb383413 2668
59727473 2669static struct demangle_component *
9334f9c6 2670d_template_param (struct d_info *di)
eb383413 2671{
d00edca5 2672 long param;
eb383413 2673
6ef6358e 2674 if (! d_check_char (di, 'T'))
d00edca5 2675 return NULL;
eb383413 2676
664aa91f
DD
2677 param = d_compact_number (di);
2678 if (param < 0)
d00edca5 2679 return NULL;
eb383413 2680
b6fb00c0
DD
2681 ++di->did_subs;
2682
d00edca5 2683 return d_make_template_param (di, param);
eb383413
L
2684}
2685
d00edca5
DD
2686/* <template-args> ::= I <template-arg>+ E */
2687
59727473 2688static struct demangle_component *
9334f9c6 2689d_template_args (struct d_info *di)
eb383413 2690{
59727473
DD
2691 struct demangle_component *hold_last_name;
2692 struct demangle_component *al;
2693 struct demangle_component **pal;
eb383413 2694
d00edca5
DD
2695 /* Preserve the last name we saw--don't let the template arguments
2696 clobber it, as that would give us the wrong name for a subsequent
2697 constructor or destructor. */
2698 hold_last_name = di->last_name;
eb383413 2699
eb7b5ddb
DD
2700 if (d_peek_char (di) != 'I'
2701 && d_peek_char (di) != 'J')
d00edca5 2702 return NULL;
eb7b5ddb 2703 d_advance (di, 1);
eb383413 2704
1c08f2c8
DD
2705 if (d_peek_char (di) == 'E')
2706 {
2707 /* An argument pack can be empty. */
2708 d_advance (di, 1);
2709 return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, NULL, NULL);
2710 }
2711
d00edca5
DD
2712 al = NULL;
2713 pal = &al;
eb383413
L
2714 while (1)
2715 {
59727473 2716 struct demangle_component *a;
d00edca5
DD
2717
2718 a = d_template_arg (di);
2719 if (a == NULL)
2720 return NULL;
2721
59727473 2722 *pal = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, a, NULL);
331c3da2
DD
2723 if (*pal == NULL)
2724 return NULL;
d00edca5
DD
2725 pal = &d_right (*pal);
2726
2727 if (d_peek_char (di) == 'E')
03d5f569 2728 {
d00edca5
DD
2729 d_advance (di, 1);
2730 break;
03d5f569 2731 }
eb383413
L
2732 }
2733
d00edca5
DD
2734 di->last_name = hold_last_name;
2735
2736 return al;
eb383413
L
2737}
2738
d00edca5
DD
2739/* <template-arg> ::= <type>
2740 ::= X <expression> E
2741 ::= <expr-primary>
2742*/
eb383413 2743
59727473 2744static struct demangle_component *
9334f9c6 2745d_template_arg (struct d_info *di)
eb383413 2746{
59727473 2747 struct demangle_component *ret;
03d5f569 2748
d00edca5 2749 switch (d_peek_char (di))
eb383413 2750 {
d00edca5
DD
2751 case 'X':
2752 d_advance (di, 1);
2753 ret = d_expression (di);
6ef6358e 2754 if (! d_check_char (di, 'E'))
d00edca5
DD
2755 return NULL;
2756 return ret;
b851d07b 2757
d00edca5
DD
2758 case 'L':
2759 return d_expr_primary (di);
eb383413 2760
1c08f2c8 2761 case 'I':
eb7b5ddb 2762 case 'J':
1c08f2c8
DD
2763 /* An argument pack. */
2764 return d_template_args (di);
2765
d00edca5 2766 default:
59727473 2767 return cplus_demangle_type (di);
74bcd529 2768 }
eb383413
L
2769}
2770
eb7b5ddb
DD
2771/* Parse a sequence of expressions until we hit the terminator
2772 character. */
ba8cb4ba
DD
2773
2774static struct demangle_component *
eb7b5ddb 2775d_exprlist (struct d_info *di, char terminator)
ba8cb4ba
DD
2776{
2777 struct demangle_component *list = NULL;
2778 struct demangle_component **p = &list;
2779
eb7b5ddb 2780 if (d_peek_char (di) == terminator)
1c08f2c8
DD
2781 {
2782 d_advance (di, 1);
2783 return d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, NULL, NULL);
2784 }
2785
ba8cb4ba
DD
2786 while (1)
2787 {
2788 struct demangle_component *arg = d_expression (di);
2789 if (arg == NULL)
2790 return NULL;
2791
2792 *p = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, arg, NULL);
2793 if (*p == NULL)
2794 return NULL;
2795 p = &d_right (*p);
2796
eb7b5ddb 2797 if (d_peek_char (di) == terminator)
ba8cb4ba
DD
2798 {
2799 d_advance (di, 1);
2800 break;
2801 }
2802 }
2803
2804 return list;
2805}
2806
d00edca5
DD
2807/* <expression> ::= <(unary) operator-name> <expression>
2808 ::= <(binary) operator-name> <expression> <expression>
2809 ::= <(trinary) operator-name> <expression> <expression> <expression>
ba8cb4ba 2810 ::= cl <expression>+ E
d00edca5
DD
2811 ::= st <type>
2812 ::= <template-param>
2813 ::= sr <type> <unqualified-name>
2814 ::= sr <type> <unqualified-name> <template-args>
2815 ::= <expr-primary>
2816*/
2817
59727473 2818static struct demangle_component *
9334f9c6 2819d_expression (struct d_info *di)
eb383413 2820{
d00edca5 2821 char peek;
eb383413 2822
d00edca5
DD
2823 peek = d_peek_char (di);
2824 if (peek == 'L')
2825 return d_expr_primary (di);
2826 else if (peek == 'T')
2827 return d_template_param (di);
2828 else if (peek == 's' && d_peek_next_char (di) == 'r')
eb383413 2829 {
59727473
DD
2830 struct demangle_component *type;
2831 struct demangle_component *name;
eb383413 2832
d00edca5 2833 d_advance (di, 2);
59727473 2834 type = cplus_demangle_type (di);
d00edca5
DD
2835 name = d_unqualified_name (di);
2836 if (d_peek_char (di) != 'I')
59727473 2837 return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type, name);
d00edca5 2838 else
59727473
DD
2839 return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type,
2840 d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
d00edca5 2841 d_template_args (di)));
793011ca 2842 }
e2e1864d
DD
2843 else if (peek == 's' && d_peek_next_char (di) == 'p')
2844 {
2845 d_advance (di, 2);
2846 return d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION,
2847 d_expression (di), NULL);
2848 }
c743cf5d 2849 else if (peek == 'f' && d_peek_next_char (di) == 'p')
ba8cb4ba 2850 {
c743cf5d
DD
2851 /* Function parameter used in a late-specified return type. */
2852 int index;
ba8cb4ba 2853 d_advance (di, 2);
f2917a30
DD
2854 if (d_peek_char (di) == 'T')
2855 {
2856 /* 'this' parameter. */
2857 d_advance (di, 1);
2858 index = 0;
2859 }
2860 else
2861 {
2862 index = d_compact_number (di) + 1;
2863 if (index == 0)
2864 return NULL;
2865 }
c743cf5d 2866 return d_make_function_param (di, index);
ba8cb4ba 2867 }
cbc43128
DD
2868 else if (IS_DIGIT (peek)
2869 || (peek == 'o' && d_peek_next_char (di) == 'n'))
1c08f2c8
DD
2870 {
2871 /* We can get an unqualified name as an expression in the case of
cbc43128
DD
2872 a dependent function call, i.e. decltype(f(t)). */
2873 struct demangle_component *name;
2874
2875 if (peek == 'o')
2876 /* operator-function-id, i.e. operator+(t). */
2877 d_advance (di, 2);
2878
2879 name = d_unqualified_name (di);
1c08f2c8
DD
2880 if (name == NULL)
2881 return NULL;
2882 if (d_peek_char (di) == 'I')
2883 return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
2884 d_template_args (di));
2885 else
2886 return name;
2887 }
eb7b5ddb
DD
2888 else if ((peek == 'i' || peek == 't')
2889 && d_peek_next_char (di) == 'l')
2890 {
2891 /* Brace-enclosed initializer list, untyped or typed. */
2892 struct demangle_component *type = NULL;
2893 if (peek == 't')
2894 type = cplus_demangle_type (di);
2895 d_advance (di, 2);
2896 return d_make_comp (di, DEMANGLE_COMPONENT_INITIALIZER_LIST,
2897 type, d_exprlist (di, 'E'));
2898 }
d00edca5 2899 else
eb383413 2900 {
59727473 2901 struct demangle_component *op;
eb7b5ddb 2902 const char *code = NULL;
d00edca5 2903 int args;
eb383413 2904
d00edca5
DD
2905 op = d_operator_name (di);
2906 if (op == NULL)
2907 return NULL;
eb383413 2908
59727473 2909 if (op->type == DEMANGLE_COMPONENT_OPERATOR)
eb7b5ddb
DD
2910 {
2911 code = op->u.s_operator.op->code;
2912 di->expansion += op->u.s_operator.op->len - 2;
2913 if (strcmp (code, "st") == 0)
2914 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
2915 cplus_demangle_type (di));
2916 }
eb383413 2917
d00edca5
DD
2918 switch (op->type)
2919 {
2920 default:
2921 return NULL;
59727473 2922 case DEMANGLE_COMPONENT_OPERATOR:
d00edca5
DD
2923 args = op->u.s_operator.op->args;
2924 break;
59727473 2925 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
d00edca5
DD
2926 args = op->u.s_extended_operator.args;
2927 break;
59727473 2928 case DEMANGLE_COMPONENT_CAST:
60cf58f5 2929 args = 1;
d00edca5
DD
2930 break;
2931 }
2932
2933 switch (args)
2934 {
eb7b5ddb
DD
2935 case 0:
2936 return d_make_comp (di, DEMANGLE_COMPONENT_NULLARY, op, NULL);
2937
d00edca5 2938 case 1:
c743cf5d
DD
2939 {
2940 struct demangle_component *operand;
eb7b5ddb
DD
2941 int suffix = 0;
2942
2943 if (code && (code[0] == 'p' || code[0] == 'm')
2944 && code[1] == code[0])
2945 /* pp_ and mm_ are the prefix variants. */
2946 suffix = !d_check_char (di, '_');
2947
c743cf5d
DD
2948 if (op->type == DEMANGLE_COMPONENT_CAST
2949 && d_check_char (di, '_'))
eb7b5ddb 2950 operand = d_exprlist (di, 'E');
c743cf5d
DD
2951 else
2952 operand = d_expression (di);
eb7b5ddb
DD
2953
2954 if (suffix)
2955 /* Indicate the suffix variant for d_print_comp. */
2956 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
2957 d_make_comp (di,
2958 DEMANGLE_COMPONENT_BINARY_ARGS,
2959 operand, operand));
2960 else
2961 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
2962 operand);
c743cf5d 2963 }
d00edca5
DD
2964 case 2:
2965 {
59727473 2966 struct demangle_component *left;
ba8cb4ba 2967 struct demangle_component *right;
d00edca5
DD
2968
2969 left = d_expression (di);
cbc43128 2970 if (!strcmp (code, "cl"))
eb7b5ddb 2971 right = d_exprlist (di, 'E');
cbc43128
DD
2972 else if (!strcmp (code, "dt") || !strcmp (code, "pt"))
2973 {
2974 right = d_unqualified_name (di);
2975 if (d_peek_char (di) == 'I')
2976 right = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE,
2977 right, d_template_args (di));
2978 }
ba8cb4ba
DD
2979 else
2980 right = d_expression (di);
2981
59727473
DD
2982 return d_make_comp (di, DEMANGLE_COMPONENT_BINARY, op,
2983 d_make_comp (di,
2984 DEMANGLE_COMPONENT_BINARY_ARGS,
ba8cb4ba 2985 left, right));
d00edca5
DD
2986 }
2987 case 3:
2988 {
59727473
DD
2989 struct demangle_component *first;
2990 struct demangle_component *second;
eb7b5ddb 2991 struct demangle_component *third;
d00edca5 2992
eb7b5ddb
DD
2993 if (!strcmp (code, "qu"))
2994 {
2995 /* ?: expression. */
2996 first = d_expression (di);
2997 second = d_expression (di);
2998 third = d_expression (di);
2999 }
3000 else if (code[0] == 'n')
3001 {
3002 /* new-expression. */
3003 if (code[1] != 'w' && code[1] != 'a')
3004 return NULL;
3005 first = d_exprlist (di, '_');
3006 second = cplus_demangle_type (di);
3007 if (d_peek_char (di) == 'E')
3008 {
3009 d_advance (di, 1);
3010 third = NULL;
3011 }
3012 else if (d_peek_char (di) == 'p'
3013 && d_peek_next_char (di) == 'i')
3014 {
3015 /* Parenthesized initializer. */
3016 d_advance (di, 2);
3017 third = d_exprlist (di, 'E');
3018 }
3019 else if (d_peek_char (di) == 'i'
3020 && d_peek_next_char (di) == 'l')
3021 /* initializer-list. */
3022 third = d_expression (di);
3023 else
3024 return NULL;
3025 }
3026 else
3027 return NULL;
59727473
DD
3028 return d_make_comp (di, DEMANGLE_COMPONENT_TRINARY, op,
3029 d_make_comp (di,
3030 DEMANGLE_COMPONENT_TRINARY_ARG1,
3031 first,
d00edca5 3032 d_make_comp (di,
59727473 3033 DEMANGLE_COMPONENT_TRINARY_ARG2,
eb7b5ddb 3034 second, third)));
d00edca5
DD
3035 }
3036 default:
3037 return NULL;
3038 }
eb383413
L
3039 }
3040}
3041
d00edca5
DD
3042/* <expr-primary> ::= L <type> <(value) number> E
3043 ::= L <type> <(value) float> E
3044 ::= L <mangled-name> E
3045*/
74bcd529 3046
59727473 3047static struct demangle_component *
9334f9c6 3048d_expr_primary (struct d_info *di)
74bcd529 3049{
59727473 3050 struct demangle_component *ret;
74bcd529 3051
6ef6358e 3052 if (! d_check_char (di, 'L'))
d00edca5 3053 return NULL;
c743cf5d
DD
3054 if (d_peek_char (di) == '_'
3055 /* Workaround for G++ bug; see comment in write_template_arg. */
3056 || d_peek_char (di) == 'Z')
59727473 3057 ret = cplus_demangle_mangled_name (di, 0);
d00edca5 3058 else
74bcd529 3059 {
59727473
DD
3060 struct demangle_component *type;
3061 enum demangle_component_type t;
d00edca5
DD
3062 const char *s;
3063
59727473 3064 type = cplus_demangle_type (di);
a21da8bf
DD
3065 if (type == NULL)
3066 return NULL;
d00edca5 3067
b6fb00c0
DD
3068 /* If we have a type we know how to print, we aren't going to
3069 print the type name itself. */
59727473 3070 if (type->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
b6fb00c0
DD
3071 && type->u.s_builtin.type->print != D_PRINT_DEFAULT)
3072 di->expansion -= type->u.s_builtin.type->len;
3073
d00edca5
DD
3074 /* Rather than try to interpret the literal value, we just
3075 collect it as a string. Note that it's possible to have a
3076 floating point literal here. The ABI specifies that the
3077 format of such literals is machine independent. That's fine,
3078 but what's not fine is that versions of g++ up to 3.2 with
3079 -fabi-version=1 used upper case letters in the hex constant,
3080 and dumped out gcc's internal representation. That makes it
3081 hard to tell where the constant ends, and hard to dump the
3082 constant in any readable form anyhow. We don't attempt to
3083 handle these cases. */
3084
59727473 3085 t = DEMANGLE_COMPONENT_LITERAL;
97ceaf5b
DD
3086 if (d_peek_char (di) == 'n')
3087 {
59727473 3088 t = DEMANGLE_COMPONENT_LITERAL_NEG;
97ceaf5b
DD
3089 d_advance (di, 1);
3090 }
d00edca5
DD
3091 s = d_str (di);
3092 while (d_peek_char (di) != 'E')
6ba85b8c
DD
3093 {
3094 if (d_peek_char (di) == '\0')
3095 return NULL;
3096 d_advance (di, 1);
3097 }
97ceaf5b 3098 ret = d_make_comp (di, t, type, d_make_name (di, s, d_str (di) - s));
d00edca5 3099 }
6ef6358e 3100 if (! d_check_char (di, 'E'))
d00edca5
DD
3101 return NULL;
3102 return ret;
74bcd529
DD
3103}
3104
d00edca5
DD
3105/* <local-name> ::= Z <(function) encoding> E <(entity) name> [<discriminator>]
3106 ::= Z <(function) encoding> E s [<discriminator>]
3107*/
74bcd529 3108
59727473 3109static struct demangle_component *
9334f9c6 3110d_local_name (struct d_info *di)
74bcd529 3111{
59727473 3112 struct demangle_component *function;
74bcd529 3113
6ef6358e 3114 if (! d_check_char (di, 'Z'))
d00edca5 3115 return NULL;
74bcd529 3116
6d95373e 3117 function = d_encoding (di, 0);
74bcd529 3118
6ef6358e 3119 if (! d_check_char (di, 'E'))
d00edca5 3120 return NULL;
74bcd529 3121
d00edca5 3122 if (d_peek_char (di) == 's')
74bcd529 3123 {
d00edca5
DD
3124 d_advance (di, 1);
3125 if (! d_discriminator (di))
3126 return NULL;
59727473 3127 return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function,
d00edca5
DD
3128 d_make_name (di, "string literal",
3129 sizeof "string literal" - 1));
74bcd529 3130 }
d00edca5 3131 else
74bcd529 3132 {
59727473 3133 struct demangle_component *name;
664aa91f
DD
3134 int num = -1;
3135
3136 if (d_peek_char (di) == 'd')
3137 {
3138 /* Default argument scope: d <number> _. */
3139 d_advance (di, 1);
3140 num = d_compact_number (di);
3141 if (num < 0)
3142 return NULL;
3143 }
74bcd529 3144
d00edca5 3145 name = d_name (di);
664aa91f
DD
3146 if (name)
3147 switch (name->type)
3148 {
3149 /* Lambdas and unnamed types have internal discriminators. */
3150 case DEMANGLE_COMPONENT_LAMBDA:
3151 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
3152 break;
3153 default:
3154 if (! d_discriminator (di))
3155 return NULL;
3156 }
3157 if (num >= 0)
3158 name = d_make_default_arg (di, num, name);
59727473 3159 return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function, name);
74bcd529 3160 }
74bcd529
DD
3161}
3162
d00edca5 3163/* <discriminator> ::= _ <(non-negative) number>
eb383413 3164
d00edca5
DD
3165 We demangle the discriminator, but we don't print it out. FIXME:
3166 We should print it out in verbose mode. */
74bcd529 3167
d00edca5 3168static int
9334f9c6 3169d_discriminator (struct d_info *di)
d00edca5
DD
3170{
3171 long discrim;
74bcd529 3172
d00edca5
DD
3173 if (d_peek_char (di) != '_')
3174 return 1;
3175 d_advance (di, 1);
3176 discrim = d_number (di);
3177 if (discrim < 0)
3178 return 0;
3179 return 1;
3180}
eb383413 3181
664aa91f
DD
3182/* <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _ */
3183
3184static struct demangle_component *
3185d_lambda (struct d_info *di)
3186{
3187 struct demangle_component *tl;
3188 struct demangle_component *ret;
3189 int num;
3190
3191 if (! d_check_char (di, 'U'))
3192 return NULL;
3193 if (! d_check_char (di, 'l'))
3194 return NULL;
3195
3196 tl = d_parmlist (di);
3197 if (tl == NULL)
3198 return NULL;
3199
3200 if (! d_check_char (di, 'E'))
3201 return NULL;
3202
3203 num = d_compact_number (di);
3204 if (num < 0)
3205 return NULL;
3206
3207 ret = d_make_empty (di);
3208 if (ret)
3209 {
3210 ret->type = DEMANGLE_COMPONENT_LAMBDA;
3211 ret->u.s_unary_num.sub = tl;
3212 ret->u.s_unary_num.num = num;
3213 }
3214
3215 if (! d_add_substitution (di, ret))
3216 return NULL;
3217
3218 return ret;
3219}
3220
3221/* <unnamed-type-name> ::= Ut [ <nonnegative number> ] _ */
3222
3223static struct demangle_component *
3224d_unnamed_type (struct d_info *di)
3225{
3226 struct demangle_component *ret;
3227 long num;
3228
3229 if (! d_check_char (di, 'U'))
3230 return NULL;
3231 if (! d_check_char (di, 't'))
3232 return NULL;
3233
3234 num = d_compact_number (di);
3235 if (num < 0)
3236 return NULL;
3237
3238 ret = d_make_empty (di);
3239 if (ret)
3240 {
3241 ret->type = DEMANGLE_COMPONENT_UNNAMED_TYPE;
3242 ret->u.s_number.number = num;
3243 }
3244
3245 if (! d_add_substitution (di, ret))
3246 return NULL;
3247
3248 return ret;
3249}
3250
7955ede5
DD
3251/* <clone-suffix> ::= [ . <clone-type-identifier> ] [ . <nonnegative number> ]*
3252*/
3253
3254static struct demangle_component *
3255d_clone_suffix (struct d_info *di, struct demangle_component *encoding)
3256{
3257 const char *suffix = d_str (di);
3258 const char *pend = suffix;
3259 struct demangle_component *n;
3260
3261 if (*pend == '.' && (IS_LOWER (pend[1]) || pend[1] == '_'))
3262 {
3263 pend += 2;
3264 while (IS_LOWER (*pend) || *pend == '_')
3265 ++pend;
3266 }
3267 while (*pend == '.' && IS_DIGIT (pend[1]))
3268 {
3269 pend += 2;
3270 while (IS_DIGIT (*pend))
3271 ++pend;
3272 }
3273 d_advance (di, pend - suffix);
3274 n = d_make_name (di, suffix, pend - suffix);
3275 return d_make_comp (di, DEMANGLE_COMPONENT_CLONE, encoding, n);
3276}
3277
d00edca5 3278/* Add a new substitution. */
eb383413 3279
d00edca5 3280static int
9334f9c6 3281d_add_substitution (struct d_info *di, struct demangle_component *dc)
eb383413 3282{
331c3da2
DD
3283 if (dc == NULL)
3284 return 0;
d00edca5
DD
3285 if (di->next_sub >= di->num_subs)
3286 return 0;
3287 di->subs[di->next_sub] = dc;
3288 ++di->next_sub;
3289 return 1;
3290}
3291
3292/* <substitution> ::= S <seq-id> _
3293 ::= S_
3294 ::= St
3295 ::= Sa
3296 ::= Sb
3297 ::= Ss
3298 ::= Si
3299 ::= So
3300 ::= Sd
97ceaf5b
DD
3301
3302 If PREFIX is non-zero, then this type is being used as a prefix in
3303 a qualified name. In this case, for the standard substitutions, we
3304 need to check whether we are being used as a prefix for a
3305 constructor or destructor, and return a full template name.
3306 Otherwise we will get something like std::iostream::~iostream()
3307 which does not correspond particularly well to any function which
3308 actually appears in the source.
d00edca5 3309*/
eb383413 3310
97ceaf5b
DD
3311static const struct d_standard_sub_info standard_subs[] =
3312{
b6fb00c0
DD
3313 { 't', NL ("std"),
3314 NL ("std"),
3315 NULL, 0 },
3316 { 'a', NL ("std::allocator"),
3317 NL ("std::allocator"),
3318 NL ("allocator") },
3319 { 'b', NL ("std::basic_string"),
3320 NL ("std::basic_string"),
3321 NL ("basic_string") },
3322 { 's', NL ("std::string"),
3323 NL ("std::basic_string<char, std::char_traits<char>, std::allocator<char> >"),
3324 NL ("basic_string") },
3325 { 'i', NL ("std::istream"),
3326 NL ("std::basic_istream<char, std::char_traits<char> >"),
3327 NL ("basic_istream") },
3328 { 'o', NL ("std::ostream"),
3329 NL ("std::basic_ostream<char, std::char_traits<char> >"),
3330 NL ("basic_ostream") },
3331 { 'd', NL ("std::iostream"),
3332 NL ("std::basic_iostream<char, std::char_traits<char> >"),
3333 NL ("basic_iostream") }
97ceaf5b
DD
3334};
3335
59727473 3336static struct demangle_component *
9334f9c6 3337d_substitution (struct d_info *di, int prefix)
d00edca5
DD
3338{
3339 char c;
eb383413 3340
6ef6358e 3341 if (! d_check_char (di, 'S'))
d00edca5 3342 return NULL;
e7e9b069 3343
d00edca5 3344 c = d_next_char (di);
858b45cf 3345 if (c == '_' || IS_DIGIT (c) || IS_UPPER (c))
eb383413 3346 {
dddc49b7 3347 unsigned int id;
eb383413 3348
d00edca5
DD
3349 id = 0;
3350 if (c != '_')
eb383413 3351 {
d00edca5 3352 do
eb383413 3353 {
dddc49b7
DD
3354 unsigned int new_id;
3355
d00edca5 3356 if (IS_DIGIT (c))
dddc49b7 3357 new_id = id * 36 + c - '0';
858b45cf 3358 else if (IS_UPPER (c))
dddc49b7 3359 new_id = id * 36 + c - 'A' + 10;
d00edca5
DD
3360 else
3361 return NULL;
dddc49b7 3362 if (new_id < id)
e63f184e 3363 return NULL;
dddc49b7 3364 id = new_id;
d00edca5 3365 c = d_next_char (di);
eb383413 3366 }
d00edca5 3367 while (c != '_');
eb383413 3368
d00edca5 3369 ++id;
eb383413 3370 }
eb383413 3371
dddc49b7 3372 if (id >= (unsigned int) di->next_sub)
d00edca5 3373 return NULL;
eb383413 3374
b6fb00c0
DD
3375 ++di->did_subs;
3376
d00edca5 3377 return di->subs[id];
eb383413 3378 }
d00edca5 3379 else
eb383413 3380 {
97ceaf5b
DD
3381 int verbose;
3382 const struct d_standard_sub_info *p;
3383 const struct d_standard_sub_info *pend;
3384
3385 verbose = (di->options & DMGL_VERBOSE) != 0;
3386 if (! verbose && prefix)
e61231f1 3387 {
97ceaf5b
DD
3388 char peek;
3389
3390 peek = d_peek_char (di);
3391 if (peek == 'C' || peek == 'D')
3392 verbose = 1;
eb383413 3393 }
97ceaf5b
DD
3394
3395 pend = (&standard_subs[0]
3396 + sizeof standard_subs / sizeof standard_subs[0]);
3397 for (p = &standard_subs[0]; p < pend; ++p)
3398 {
3399 if (c == p->code)
3400 {
b6fb00c0
DD
3401 const char *s;
3402 int len;
3403
97ceaf5b 3404 if (p->set_last_name != NULL)
b6fb00c0
DD
3405 di->last_name = d_make_sub (di, p->set_last_name,
3406 p->set_last_name_len);
97ceaf5b 3407 if (verbose)
b6fb00c0
DD
3408 {
3409 s = p->full_expansion;
3410 len = p->full_len;
3411 }
97ceaf5b 3412 else
b6fb00c0
DD
3413 {
3414 s = p->simple_expansion;
3415 len = p->simple_len;
3416 }
3417 di->expansion += len;
3418 return d_make_sub (di, s, len);
97ceaf5b
DD
3419 }
3420 }
3421
3422 return NULL;
eb383413 3423 }
eb383413
L
3424}
3425
208c1674 3426/* Initialize a growable string. */
eb383413 3427
d00edca5 3428static void
208c1674 3429d_growable_string_init (struct d_growable_string *dgs, size_t estimate)
d00edca5 3430{
208c1674
DD
3431 dgs->buf = NULL;
3432 dgs->len = 0;
3433 dgs->alc = 0;
3434 dgs->allocation_failure = 0;
eb383413 3435
208c1674
DD
3436 if (estimate > 0)
3437 d_growable_string_resize (dgs, estimate);
3438}
3439
3440/* Grow a growable string to a given size. */
3441
3442static inline void
3443d_growable_string_resize (struct d_growable_string *dgs, size_t need)
3444{
3445 size_t newalc;
3446 char *newbuf;
3447
3448 if (dgs->allocation_failure)
331c3da2 3449 return;
59666b35 3450
208c1674
DD
3451 /* Start allocation at two bytes to avoid any possibility of confusion
3452 with the special value of 1 used as a return in *palc to indicate
3453 allocation failures. */
3454 newalc = dgs->alc > 0 ? dgs->alc : 2;
3455 while (newalc < need)
3456 newalc <<= 1;
3457
3458 newbuf = (char *) realloc (dgs->buf, newalc);
3459 if (newbuf == NULL)
3460 {
3461 free (dgs->buf);
3462 dgs->buf = NULL;
3463 dgs->len = 0;
3464 dgs->alc = 0;
3465 dgs->allocation_failure = 1;
3466 return;
eb383413 3467 }
208c1674
DD
3468 dgs->buf = newbuf;
3469 dgs->alc = newalc;
d00edca5 3470}
0976f6a7 3471
208c1674 3472/* Append a buffer to a growable string. */
0976f6a7 3473
208c1674
DD
3474static inline void
3475d_growable_string_append_buffer (struct d_growable_string *dgs,
3476 const char *s, size_t l)
d00edca5 3477{
208c1674 3478 size_t need;
0976f6a7 3479
208c1674
DD
3480 need = dgs->len + l + 1;
3481 if (need > dgs->alc)
3482 d_growable_string_resize (dgs, need);
3483
3484 if (dgs->allocation_failure)
3485 return;
3486
3487 memcpy (dgs->buf + dgs->len, s, l);
3488 dgs->buf[dgs->len + l] = '\0';
3489 dgs->len += l;
eb383413
L
3490}
3491
208c1674 3492/* Bridge growable strings to the callback mechanism. */
d00edca5
DD
3493
3494static void
208c1674 3495d_growable_string_callback_adapter (const char *s, size_t l, void *opaque)
eb383413 3496{
208c1674 3497 struct d_growable_string *dgs = (struct d_growable_string*) opaque;
eb383413 3498
208c1674 3499 d_growable_string_append_buffer (dgs, s, l);
eb383413
L
3500}
3501
208c1674 3502/* Initialize a print information structure. */
eb383413 3503
d00edca5 3504static void
ddee5e46
DD
3505d_print_init (struct d_print_info *dpi, demangle_callbackref callback,
3506 void *opaque)
208c1674 3507{
208c1674
DD
3508 dpi->len = 0;
3509 dpi->last_char = '\0';
3510 dpi->templates = NULL;
3511 dpi->modifiers = NULL;
04aed652 3512 dpi->pack_index = 0;
3baae9d6 3513 dpi->flush_count = 0;
208c1674
DD
3514
3515 dpi->callback = callback;
3516 dpi->opaque = opaque;
3517
3518 dpi->demangle_failure = 0;
3519}
3520
3521/* Indicate that an error occurred during printing, and test for error. */
3522
3523static inline void
9334f9c6 3524d_print_error (struct d_print_info *dpi)
bc9bf259 3525{
208c1674
DD
3526 dpi->demangle_failure = 1;
3527}
3528
3529static inline int
3530d_print_saw_error (struct d_print_info *dpi)
3531{
3532 return dpi->demangle_failure != 0;
3533}
3534
3535/* Flush buffered characters to the callback. */
3536
3537static inline void
3538d_print_flush (struct d_print_info *dpi)
3539{
3540 dpi->buf[dpi->len] = '\0';
3541 dpi->callback (dpi->buf, dpi->len, dpi->opaque);
3542 dpi->len = 0;
3baae9d6 3543 dpi->flush_count++;
208c1674
DD
3544}
3545
3546/* Append characters and buffers for printing. */
3547
3548static inline void
3549d_append_char (struct d_print_info *dpi, char c)
3550{
3551 if (dpi->len == sizeof (dpi->buf) - 1)
3552 d_print_flush (dpi);
3553
3554 dpi->buf[dpi->len++] = c;
3555 dpi->last_char = c;
3556}
3557
3558static inline void
3559d_append_buffer (struct d_print_info *dpi, const char *s, size_t l)
3560{
3561 size_t i;
3562
3563 for (i = 0; i < l; i++)
3564 d_append_char (dpi, s[i]);
3565}
3566
3567static inline void
3568d_append_string (struct d_print_info *dpi, const char *s)
3569{
3570 d_append_buffer (dpi, s, strlen (s));
3571}
3572
664aa91f
DD
3573static inline void
3574d_append_num (struct d_print_info *dpi, long l)
3575{
3576 char buf[25];
3577 sprintf (buf,"%ld", l);
3578 d_append_string (dpi, buf);
3579}
3580
208c1674
DD
3581static inline char
3582d_last_char (struct d_print_info *dpi)
3583{
3584 return dpi->last_char;
3585}
3586
3587/* Turn components into a human readable string. OPTIONS is the
3588 options bits passed to the demangler. DC is the tree to print.
3589 CALLBACK is a function to call to flush demangled string segments
3590 as they fill the intermediate buffer, and OPAQUE is a generalized
3591 callback argument. On success, this returns 1. On failure,
3592 it returns 0, indicating a bad parse. It does not use heap
3593 memory to build an output string, so cannot encounter memory
3594 allocation failure. */
3595
3596CP_STATIC_IF_GLIBCPP_V3
3597int
3598cplus_demangle_print_callback (int options,
3599 const struct demangle_component *dc,
3600 demangle_callbackref callback, void *opaque)
3601{
3602 struct d_print_info dpi;
3603
ddee5e46 3604 d_print_init (&dpi, callback, opaque);
208c1674 3605
ddee5e46 3606 d_print_comp (&dpi, options, dc);
208c1674
DD
3607
3608 d_print_flush (&dpi);
3609
3610 return ! d_print_saw_error (&dpi);
d00edca5 3611}
bc9bf259 3612
b6fb00c0
DD
3613/* Turn components into a human readable string. OPTIONS is the
3614 options bits passed to the demangler. DC is the tree to print.
3615 ESTIMATE is a guess at the length of the result. This returns a
3616 string allocated by malloc, or NULL on error. On success, this
3617 sets *PALC to the size of the allocated buffer. On failure, this
3618 sets *PALC to 0 for a bad parse, or to 1 for a memory allocation
3619 failure. */
eb383413 3620
59727473
DD
3621CP_STATIC_IF_GLIBCPP_V3
3622char *
9334f9c6
DD
3623cplus_demangle_print (int options, const struct demangle_component *dc,
3624 int estimate, size_t *palc)
d00edca5 3625{
208c1674 3626 struct d_growable_string dgs;
eb383413 3627
208c1674 3628 d_growable_string_init (&dgs, estimate);
eb383413 3629
208c1674
DD
3630 if (! cplus_demangle_print_callback (options, dc,
3631 d_growable_string_callback_adapter,
3632 &dgs))
eb383413 3633 {
208c1674
DD
3634 free (dgs.buf);
3635 *palc = 0;
d00edca5 3636 return NULL;
eb383413 3637 }
eb383413 3638
208c1674
DD
3639 *palc = dgs.allocation_failure ? 1 : dgs.alc;
3640 return dgs.buf;
eb383413
L
3641}
3642
1c08f2c8
DD
3643/* Returns the I'th element of the template arglist ARGS, or NULL on
3644 failure. */
3645
3646static struct demangle_component *
3647d_index_template_argument (struct demangle_component *args, int i)
3648{
3649 struct demangle_component *a;
3650
3651 for (a = args;
3652 a != NULL;
3653 a = d_right (a))
3654 {
3655 if (a->type != DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
3656 return NULL;
3657 if (i <= 0)
3658 break;
3659 --i;
3660 }
3661 if (i != 0 || a == NULL)
3662 return NULL;
3663
3664 return d_left (a);
3665}
3666
3667/* Returns the template argument from the current context indicated by DC,
3668 which is a DEMANGLE_COMPONENT_TEMPLATE_PARAM, or NULL. */
3669
3670static struct demangle_component *
3671d_lookup_template_argument (struct d_print_info *dpi,
3672 const struct demangle_component *dc)
3673{
3674 if (dpi->templates == NULL)
3675 {
3676 d_print_error (dpi);
3677 return NULL;
3678 }
3679
3680 return d_index_template_argument
3681 (d_right (dpi->templates->template_decl),
3682 dc->u.s_number.number);
3683}
3684
3685/* Returns a template argument pack used in DC (any will do), or NULL. */
3686
3687static struct demangle_component *
3688d_find_pack (struct d_print_info *dpi,
3689 const struct demangle_component *dc)
3690{
3691 struct demangle_component *a;
3692 if (dc == NULL)
3693 return NULL;
3694
3695 switch (dc->type)
3696 {
3697 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
3698 a = d_lookup_template_argument (dpi, dc);
3699 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
3700 return a;
3701 return NULL;
3702
3703 case DEMANGLE_COMPONENT_PACK_EXPANSION:
3704 return NULL;
3705
57cf60a5 3706 case DEMANGLE_COMPONENT_LAMBDA:
1c08f2c8
DD
3707 case DEMANGLE_COMPONENT_NAME:
3708 case DEMANGLE_COMPONENT_OPERATOR:
3709 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
3710 case DEMANGLE_COMPONENT_SUB_STD:
3711 case DEMANGLE_COMPONENT_CHARACTER:
e2e1864d 3712 case DEMANGLE_COMPONENT_FUNCTION_PARAM:
1c08f2c8
DD
3713 return NULL;
3714
3715 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
3716 return d_find_pack (dpi, dc->u.s_extended_operator.name);
3717 case DEMANGLE_COMPONENT_CTOR:
3718 return d_find_pack (dpi, dc->u.s_ctor.name);
3719 case DEMANGLE_COMPONENT_DTOR:
3720 return d_find_pack (dpi, dc->u.s_dtor.name);
3721
3722 default:
3723 a = d_find_pack (dpi, d_left (dc));
3724 if (a)
3725 return a;
3726 return d_find_pack (dpi, d_right (dc));
3727 }
3728}
3729
3730/* Returns the length of the template argument pack DC. */
3731
3732static int
3733d_pack_length (const struct demangle_component *dc)
3734{
3735 int count = 0;
3736 while (dc && dc->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
3737 && d_left (dc) != NULL)
3738 {
3739 ++count;
3740 dc = d_right (dc);
3741 }
3742 return count;
3743}
3744
3745/* DC is a component of a mangled expression. Print it, wrapped in parens
3746 if needed. */
3747
3748static void
ddee5e46 3749d_print_subexpr (struct d_print_info *dpi, int options,
1c08f2c8
DD
3750 const struct demangle_component *dc)
3751{
3752 int simple = 0;
e2e1864d 3753 if (dc->type == DEMANGLE_COMPONENT_NAME
eb7b5ddb
DD
3754 || dc->type == DEMANGLE_COMPONENT_QUAL_NAME
3755 || dc->type == DEMANGLE_COMPONENT_INITIALIZER_LIST
e2e1864d 3756 || dc->type == DEMANGLE_COMPONENT_FUNCTION_PARAM)
1c08f2c8
DD
3757 simple = 1;
3758 if (!simple)
3759 d_append_char (dpi, '(');
ddee5e46 3760 d_print_comp (dpi, options, dc);
1c08f2c8
DD
3761 if (!simple)
3762 d_append_char (dpi, ')');
3763}
3764
d00edca5 3765/* Subroutine to handle components. */
eb383413 3766
d00edca5 3767static void
ddee5e46 3768d_print_comp (struct d_print_info *dpi, int options,
9334f9c6 3769 const struct demangle_component *dc)
eb383413 3770{
b24539b3
DD
3771 /* Magic variable to let reference smashing skip over the next modifier
3772 without needing to modify *dc. */
3773 const struct demangle_component *mod_inner = NULL;
3774
d00edca5 3775 if (dc == NULL)
eb383413 3776 {
d00edca5
DD
3777 d_print_error (dpi);
3778 return;
eb383413 3779 }
d00edca5
DD
3780 if (d_print_saw_error (dpi))
3781 return;
eb383413 3782
d00edca5 3783 switch (dc->type)
eb383413 3784 {
59727473 3785 case DEMANGLE_COMPONENT_NAME:
ddee5e46 3786 if ((options & DMGL_JAVA) == 0)
b6fb00c0
DD
3787 d_append_buffer (dpi, dc->u.s_name.s, dc->u.s_name.len);
3788 else
3789 d_print_java_identifier (dpi, dc->u.s_name.s, dc->u.s_name.len);
d00edca5 3790 return;
eb383413 3791
59727473
DD
3792 case DEMANGLE_COMPONENT_QUAL_NAME:
3793 case DEMANGLE_COMPONENT_LOCAL_NAME:
ddee5e46
DD
3794 d_print_comp (dpi, options, d_left (dc));
3795 if ((options & DMGL_JAVA) == 0)
208c1674 3796 d_append_string (dpi, "::");
b6fb00c0
DD
3797 else
3798 d_append_char (dpi, '.');
ddee5e46 3799 d_print_comp (dpi, options, d_right (dc));
d00edca5 3800 return;
eb383413 3801
59727473 3802 case DEMANGLE_COMPONENT_TYPED_NAME:
d00edca5 3803 {
858b45cf 3804 struct d_print_mod *hold_modifiers;
59727473 3805 struct demangle_component *typed_name;
858b45cf
DD
3806 struct d_print_mod adpm[4];
3807 unsigned int i;
d00edca5
DD
3808 struct d_print_template dpt;
3809
3810 /* Pass the name down to the type so that it can be printed in
858b45cf
DD
3811 the right place for the type. We also have to pass down
3812 any CV-qualifiers, which apply to the this parameter. */
3813 hold_modifiers = dpi->modifiers;
c743cf5d 3814 dpi->modifiers = 0;
858b45cf 3815 i = 0;
d00edca5 3816 typed_name = d_left (dc);
858b45cf
DD
3817 while (typed_name != NULL)
3818 {
3819 if (i >= sizeof adpm / sizeof adpm[0])
3820 {
3821 d_print_error (dpi);
3822 return;
3823 }
d00edca5 3824
858b45cf
DD
3825 adpm[i].next = dpi->modifiers;
3826 dpi->modifiers = &adpm[i];
3827 adpm[i].mod = typed_name;
3828 adpm[i].printed = 0;
3829 adpm[i].templates = dpi->templates;
3830 ++i;
3831
59727473
DD
3832 if (typed_name->type != DEMANGLE_COMPONENT_RESTRICT_THIS
3833 && typed_name->type != DEMANGLE_COMPONENT_VOLATILE_THIS
3834 && typed_name->type != DEMANGLE_COMPONENT_CONST_THIS)
858b45cf
DD
3835 break;
3836
3837 typed_name = d_left (typed_name);
3838 }
d00edca5 3839
168b8298
MS
3840 if (typed_name == NULL)
3841 {
3842 d_print_error (dpi);
3843 return;
3844 }
3845
d00edca5
DD
3846 /* If typed_name is a template, then it applies to the
3847 function type as well. */
59727473 3848 if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
d00edca5
DD
3849 {
3850 dpt.next = dpi->templates;
3851 dpi->templates = &dpt;
abf6a75b 3852 dpt.template_decl = typed_name;
d00edca5 3853 }
eb383413 3854
59727473
DD
3855 /* If typed_name is a DEMANGLE_COMPONENT_LOCAL_NAME, then
3856 there may be CV-qualifiers on its right argument which
3857 really apply here; this happens when parsing a class which
3858 is local to a function. */
3859 if (typed_name->type == DEMANGLE_COMPONENT_LOCAL_NAME)
d4edd112 3860 {
59727473 3861 struct demangle_component *local_name;
d4edd112
DD
3862
3863 local_name = d_right (typed_name);
664aa91f
DD
3864 if (local_name->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
3865 local_name = local_name->u.s_unary_num.sub;
59727473
DD
3866 while (local_name->type == DEMANGLE_COMPONENT_RESTRICT_THIS
3867 || local_name->type == DEMANGLE_COMPONENT_VOLATILE_THIS
3868 || local_name->type == DEMANGLE_COMPONENT_CONST_THIS)
d4edd112
DD
3869 {
3870 if (i >= sizeof adpm / sizeof adpm[0])
3871 {
3872 d_print_error (dpi);
3873 return;
3874 }
3875
3876 adpm[i] = adpm[i - 1];
3877 adpm[i].next = &adpm[i - 1];
3878 dpi->modifiers = &adpm[i];
3879
3880 adpm[i - 1].mod = local_name;
3881 adpm[i - 1].printed = 0;
3882 adpm[i - 1].templates = dpi->templates;
3883 ++i;
3884
3885 local_name = d_left (local_name);
3886 }
3887 }
3888
ddee5e46 3889 d_print_comp (dpi, options, d_right (dc));
74bcd529 3890
59727473 3891 if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
d00edca5 3892 dpi->templates = dpt.next;
eb383413 3893
858b45cf 3894 /* If the modifiers didn't get printed by the type, print them
d00edca5 3895 now. */
858b45cf 3896 while (i > 0)
d00edca5 3897 {
858b45cf
DD
3898 --i;
3899 if (! adpm[i].printed)
3900 {
3901 d_append_char (dpi, ' ');
ddee5e46 3902 d_print_mod (dpi, options, adpm[i].mod);
858b45cf 3903 }
d00edca5 3904 }
eb383413 3905
858b45cf 3906 dpi->modifiers = hold_modifiers;
eb383413 3907
d00edca5
DD
3908 return;
3909 }
eb383413 3910
59727473 3911 case DEMANGLE_COMPONENT_TEMPLATE:
331c3da2
DD
3912 {
3913 struct d_print_mod *hold_dpm;
208c1674 3914 struct demangle_component *dcl;
331c3da2
DD
3915
3916 /* Don't push modifiers into a template definition. Doing so
3917 could give the wrong definition for a template argument.
3918 Instead, treat the template essentially as a name. */
3919
3920 hold_dpm = dpi->modifiers;
3921 dpi->modifiers = NULL;
3922
208c1674
DD
3923 dcl = d_left (dc);
3924
ddee5e46 3925 if ((options & DMGL_JAVA) != 0
208c1674
DD
3926 && dcl->type == DEMANGLE_COMPONENT_NAME
3927 && dcl->u.s_name.len == 6
3928 && strncmp (dcl->u.s_name.s, "JArray", 6) == 0)
3929 {
3930 /* Special-case Java arrays, so that JArray<TYPE> appears
3931 instead as TYPE[]. */
3932
ddee5e46 3933 d_print_comp (dpi, options, d_right (dc));
208c1674
DD
3934 d_append_string (dpi, "[]");
3935 }
3936 else
3937 {
ddee5e46 3938 d_print_comp (dpi, options, dcl);
208c1674
DD
3939 if (d_last_char (dpi) == '<')
3940 d_append_char (dpi, ' ');
3941 d_append_char (dpi, '<');
ddee5e46 3942 d_print_comp (dpi, options, d_right (dc));
208c1674
DD
3943 /* Avoid generating two consecutive '>' characters, to avoid
3944 the C++ syntactic ambiguity. */
3945 if (d_last_char (dpi) == '>')
3946 d_append_char (dpi, ' ');
3947 d_append_char (dpi, '>');
3948 }
331c3da2
DD
3949
3950 dpi->modifiers = hold_dpm;
3951
3952 return;
3953 }
d00edca5 3954
59727473 3955 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
d00edca5 3956 {
d00edca5 3957 struct d_print_template *hold_dpt;
1c08f2c8 3958 struct demangle_component *a = d_lookup_template_argument (dpi, dc);
eb383413 3959
1c08f2c8
DD
3960 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
3961 a = d_index_template_argument (a, dpi->pack_index);
3962
3963 if (a == NULL)
d00edca5
DD
3964 {
3965 d_print_error (dpi);
3966 return;
3967 }
59666b35 3968
d00edca5
DD
3969 /* While processing this parameter, we need to pop the list of
3970 templates. This is because the template parameter may
3971 itself be a reference to a parameter of an outer
3972 template. */
59666b35 3973
d00edca5
DD
3974 hold_dpt = dpi->templates;
3975 dpi->templates = hold_dpt->next;
eb383413 3976
ddee5e46 3977 d_print_comp (dpi, options, a);
03d5f569 3978
d00edca5 3979 dpi->templates = hold_dpt;
59666b35 3980
d00edca5
DD
3981 return;
3982 }
eb383413 3983
59727473 3984 case DEMANGLE_COMPONENT_CTOR:
ddee5e46 3985 d_print_comp (dpi, options, dc->u.s_ctor.name);
d00edca5
DD
3986 return;
3987
59727473 3988 case DEMANGLE_COMPONENT_DTOR:
d00edca5 3989 d_append_char (dpi, '~');
ddee5e46 3990 d_print_comp (dpi, options, dc->u.s_dtor.name);
d00edca5
DD
3991 return;
3992
59727473 3993 case DEMANGLE_COMPONENT_VTABLE:
208c1674 3994 d_append_string (dpi, "vtable for ");
ddee5e46 3995 d_print_comp (dpi, options, d_left (dc));
d00edca5
DD
3996 return;
3997
59727473 3998 case DEMANGLE_COMPONENT_VTT:
208c1674 3999 d_append_string (dpi, "VTT for ");
ddee5e46 4000 d_print_comp (dpi, options, d_left (dc));
d00edca5
DD
4001 return;
4002
59727473 4003 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
208c1674 4004 d_append_string (dpi, "construction vtable for ");
ddee5e46 4005 d_print_comp (dpi, options, d_left (dc));
208c1674 4006 d_append_string (dpi, "-in-");
ddee5e46 4007 d_print_comp (dpi, options, d_right (dc));
d00edca5
DD
4008 return;
4009
59727473 4010 case DEMANGLE_COMPONENT_TYPEINFO:
208c1674 4011 d_append_string (dpi, "typeinfo for ");
ddee5e46 4012 d_print_comp (dpi, options, d_left (dc));
d00edca5
DD
4013 return;
4014
59727473 4015 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
208c1674 4016 d_append_string (dpi, "typeinfo name for ");
ddee5e46 4017 d_print_comp (dpi, options, d_left (dc));
d00edca5
DD
4018 return;
4019
59727473 4020 case DEMANGLE_COMPONENT_TYPEINFO_FN:
208c1674 4021 d_append_string (dpi, "typeinfo fn for ");
ddee5e46 4022 d_print_comp (dpi, options, d_left (dc));
d00edca5
DD
4023 return;
4024
59727473 4025 case DEMANGLE_COMPONENT_THUNK:
208c1674 4026 d_append_string (dpi, "non-virtual thunk to ");
ddee5e46 4027 d_print_comp (dpi, options, d_left (dc));
d00edca5
DD
4028 return;
4029
59727473 4030 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
208c1674 4031 d_append_string (dpi, "virtual thunk to ");
ddee5e46 4032 d_print_comp (dpi, options, d_left (dc));
d00edca5
DD
4033 return;
4034
59727473 4035 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
208c1674 4036 d_append_string (dpi, "covariant return thunk to ");
ddee5e46 4037 d_print_comp (dpi, options, d_left (dc));
d00edca5
DD
4038 return;
4039
59727473 4040 case DEMANGLE_COMPONENT_JAVA_CLASS:
208c1674 4041 d_append_string (dpi, "java Class for ");
ddee5e46 4042 d_print_comp (dpi, options, d_left (dc));
d00edca5
DD
4043 return;
4044
59727473 4045 case DEMANGLE_COMPONENT_GUARD:
208c1674 4046 d_append_string (dpi, "guard variable for ");
ddee5e46 4047 d_print_comp (dpi, options, d_left (dc));
d00edca5
DD
4048 return;
4049
59727473 4050 case DEMANGLE_COMPONENT_REFTEMP:
abc6552b
DD
4051 d_append_string (dpi, "reference temporary #");
4052 d_print_comp (dpi, options, d_right (dc));
4053 d_append_string (dpi, " for ");
ddee5e46 4054 d_print_comp (dpi, options, d_left (dc));
d00edca5
DD
4055 return;
4056
839e4798 4057 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
208c1674 4058 d_append_string (dpi, "hidden alias for ");
ddee5e46 4059 d_print_comp (dpi, options, d_left (dc));
839e4798
RH
4060 return;
4061
956a8f8b
DD
4062 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
4063 d_append_string (dpi, "transaction clone for ");
4064 d_print_comp (dpi, options, d_left (dc));
4065 return;
4066
4067 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
4068 d_append_string (dpi, "non-transaction clone for ");
4069 d_print_comp (dpi, options, d_left (dc));
4070 return;
4071
59727473 4072 case DEMANGLE_COMPONENT_SUB_STD:
b6fb00c0 4073 d_append_buffer (dpi, dc->u.s_string.string, dc->u.s_string.len);
d00edca5
DD
4074 return;
4075
59727473
DD
4076 case DEMANGLE_COMPONENT_RESTRICT:
4077 case DEMANGLE_COMPONENT_VOLATILE:
4078 case DEMANGLE_COMPONENT_CONST:
74aee4eb
DD
4079 {
4080 struct d_print_mod *pdpm;
4081
4082 /* When printing arrays, it's possible to have cases where the
4083 same CV-qualifier gets pushed on the stack multiple times.
4084 We only need to print it once. */
4085
4086 for (pdpm = dpi->modifiers; pdpm != NULL; pdpm = pdpm->next)
4087 {
4088 if (! pdpm->printed)
4089 {
4090 if (pdpm->mod->type != DEMANGLE_COMPONENT_RESTRICT
4091 && pdpm->mod->type != DEMANGLE_COMPONENT_VOLATILE
4092 && pdpm->mod->type != DEMANGLE_COMPONENT_CONST)
4093 break;
4094 if (pdpm->mod->type == dc->type)
4095 {
ddee5e46 4096 d_print_comp (dpi, options, d_left (dc));
74aee4eb
DD
4097 return;
4098 }
4099 }
4100 }
4101 }
b24539b3
DD
4102 goto modifier;
4103
4104 case DEMANGLE_COMPONENT_REFERENCE:
4105 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
4106 {
4107 /* Handle reference smashing: & + && = &. */
4108 const struct demangle_component *sub = d_left (dc);
4109 if (sub->type == DEMANGLE_COMPONENT_TEMPLATE_PARAM)
4110 {
4111 struct demangle_component *a = d_lookup_template_argument (dpi, sub);
4112 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4113 a = d_index_template_argument (a, dpi->pack_index);
04aed652
DD
4114
4115 if (a == NULL)
4116 {
4117 d_print_error (dpi);
4118 return;
4119 }
4120
b24539b3
DD
4121 sub = a;
4122 }
4123
4124 if (sub->type == DEMANGLE_COMPONENT_REFERENCE
4125 || sub->type == dc->type)
4126 dc = sub;
4127 else if (sub->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE)
4128 mod_inner = d_left (sub);
4129 }
74aee4eb 4130 /* Fall through. */
b24539b3 4131
59727473
DD
4132 case DEMANGLE_COMPONENT_RESTRICT_THIS:
4133 case DEMANGLE_COMPONENT_VOLATILE_THIS:
4134 case DEMANGLE_COMPONENT_CONST_THIS:
4135 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
4136 case DEMANGLE_COMPONENT_POINTER:
59727473
DD
4137 case DEMANGLE_COMPONENT_COMPLEX:
4138 case DEMANGLE_COMPONENT_IMAGINARY:
b24539b3 4139 modifier:
d00edca5
DD
4140 {
4141 /* We keep a list of modifiers on the stack. */
4142 struct d_print_mod dpm;
eb383413 4143
d00edca5
DD
4144 dpm.next = dpi->modifiers;
4145 dpi->modifiers = &dpm;
4146 dpm.mod = dc;
4147 dpm.printed = 0;
331c3da2 4148 dpm.templates = dpi->templates;
eb383413 4149
b24539b3
DD
4150 if (!mod_inner)
4151 mod_inner = d_left (dc);
4152
4153 d_print_comp (dpi, options, mod_inner);
59666b35 4154
d00edca5
DD
4155 /* If the modifier didn't get printed by the type, print it
4156 now. */
4157 if (! dpm.printed)
ddee5e46 4158 d_print_mod (dpi, options, dc);
eb383413 4159
d00edca5 4160 dpi->modifiers = dpm.next;
eb383413 4161
d00edca5
DD
4162 return;
4163 }
eb383413 4164
59727473 4165 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
ddee5e46 4166 if ((options & DMGL_JAVA) == 0)
b6fb00c0
DD
4167 d_append_buffer (dpi, dc->u.s_builtin.type->name,
4168 dc->u.s_builtin.type->len);
d00edca5 4169 else
b6fb00c0
DD
4170 d_append_buffer (dpi, dc->u.s_builtin.type->java_name,
4171 dc->u.s_builtin.type->java_len);
d00edca5 4172 return;
eb383413 4173
59727473 4174 case DEMANGLE_COMPONENT_VENDOR_TYPE:
ddee5e46 4175 d_print_comp (dpi, options, d_left (dc));
d00edca5 4176 return;
eb383413 4177
59727473 4178 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
d00edca5 4179 {
ddee5e46
DD
4180 if ((options & DMGL_RET_POSTFIX) != 0)
4181 d_print_function_type (dpi,
4182 options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
4183 dc, dpi->modifiers);
7887b2ce
DD
4184
4185 /* Print return type if present */
ddee5e46
DD
4186 if (d_left (dc) != NULL && (options & DMGL_RET_POSTFIX) != 0)
4187 d_print_comp (dpi, options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
4188 d_left (dc));
4189 else if (d_left (dc) != NULL && (options & DMGL_RET_DROP) == 0)
d00edca5
DD
4190 {
4191 struct d_print_mod dpm;
eb383413 4192
d00edca5
DD
4193 /* We must pass this type down as a modifier in order to
4194 print it in the right location. */
d00edca5
DD
4195 dpm.next = dpi->modifiers;
4196 dpi->modifiers = &dpm;
4197 dpm.mod = dc;
4198 dpm.printed = 0;
331c3da2 4199 dpm.templates = dpi->templates;
eb383413 4200
ddee5e46
DD
4201 d_print_comp (dpi, options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
4202 d_left (dc));
eb383413 4203
d00edca5 4204 dpi->modifiers = dpm.next;
eb383413 4205
d00edca5
DD
4206 if (dpm.printed)
4207 return;
eb383413 4208
7887b2ce
DD
4209 /* In standard prefix notation, there is a space between the
4210 return type and the function signature. */
ddee5e46 4211 if ((options & DMGL_RET_POSTFIX) == 0)
7887b2ce 4212 d_append_char (dpi, ' ');
d00edca5 4213 }
eb383413 4214
ddee5e46
DD
4215 if ((options & DMGL_RET_POSTFIX) == 0)
4216 d_print_function_type (dpi,
4217 options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
4218 dc, dpi->modifiers);
03d5f569 4219
d00edca5
DD
4220 return;
4221 }
eb383413 4222
59727473 4223 case DEMANGLE_COMPONENT_ARRAY_TYPE:
d00edca5 4224 {
74aee4eb
DD
4225 struct d_print_mod *hold_modifiers;
4226 struct d_print_mod adpm[4];
4227 unsigned int i;
4228 struct d_print_mod *pdpm;
eb383413 4229
d00edca5 4230 /* We must pass this type down as a modifier in order to print
74aee4eb
DD
4231 multi-dimensional arrays correctly. If the array itself is
4232 CV-qualified, we act as though the element type were
4233 CV-qualified. We do this by copying the modifiers down
4234 rather than fiddling pointers, so that we don't wind up
4235 with a d_print_mod higher on the stack pointing into our
4236 stack frame after we return. */
03d5f569 4237
74aee4eb
DD
4238 hold_modifiers = dpi->modifiers;
4239
4240 adpm[0].next = hold_modifiers;
4241 dpi->modifiers = &adpm[0];
4242 adpm[0].mod = dc;
4243 adpm[0].printed = 0;
4244 adpm[0].templates = dpi->templates;
4245
4246 i = 1;
4247 pdpm = hold_modifiers;
4248 while (pdpm != NULL
4249 && (pdpm->mod->type == DEMANGLE_COMPONENT_RESTRICT
4250 || pdpm->mod->type == DEMANGLE_COMPONENT_VOLATILE
4251 || pdpm->mod->type == DEMANGLE_COMPONENT_CONST))
4252 {
4253 if (! pdpm->printed)
4254 {
4255 if (i >= sizeof adpm / sizeof adpm[0])
4256 {
4257 d_print_error (dpi);
4258 return;
4259 }
4260
4261 adpm[i] = *pdpm;
4262 adpm[i].next = dpi->modifiers;
4263 dpi->modifiers = &adpm[i];
4264 pdpm->printed = 1;
4265 ++i;
4266 }
4267
4268 pdpm = pdpm->next;
4269 }
eb383413 4270
ddee5e46 4271 d_print_comp (dpi, options, d_right (dc));
eb383413 4272
74aee4eb 4273 dpi->modifiers = hold_modifiers;
eb383413 4274
74aee4eb 4275 if (adpm[0].printed)
d00edca5 4276 return;
eb383413 4277
74aee4eb
DD
4278 while (i > 1)
4279 {
4280 --i;
ddee5e46 4281 d_print_mod (dpi, options, adpm[i].mod);
74aee4eb
DD
4282 }
4283
ddee5e46 4284 d_print_array_type (dpi, options, dc, dpi->modifiers);
eb383413 4285
d00edca5
DD
4286 return;
4287 }
eb383413 4288
59727473 4289 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
cbc43128 4290 case DEMANGLE_COMPONENT_VECTOR_TYPE:
d00edca5 4291 {
d00edca5
DD
4292 struct d_print_mod dpm;
4293
d00edca5
DD
4294 dpm.next = dpi->modifiers;
4295 dpi->modifiers = &dpm;
4296 dpm.mod = dc;
4297 dpm.printed = 0;
331c3da2 4298 dpm.templates = dpi->templates;
d00edca5 4299
ddee5e46 4300 d_print_comp (dpi, options, d_right (dc));
d00edca5
DD
4301
4302 /* If the modifier didn't get printed by the type, print it
4303 now. */
4304 if (! dpm.printed)
ddee5e46 4305 d_print_mod (dpi, options, dc);
eb383413 4306
d00edca5 4307 dpi->modifiers = dpm.next;
eb383413 4308
d00edca5
DD
4309 return;
4310 }
eb383413 4311
d2825c1a
DD
4312 case DEMANGLE_COMPONENT_FIXED_TYPE:
4313 if (dc->u.s_fixed.sat)
4314 d_append_string (dpi, "_Sat ");
4315 /* Don't print "int _Accum". */
4316 if (dc->u.s_fixed.length->u.s_builtin.type
4317 != &cplus_demangle_builtin_types['i'-'a'])
4318 {
ddee5e46 4319 d_print_comp (dpi, options, dc->u.s_fixed.length);
d2825c1a
DD
4320 d_append_char (dpi, ' ');
4321 }
4322 if (dc->u.s_fixed.accum)
4323 d_append_string (dpi, "_Accum");
4324 else
4325 d_append_string (dpi, "_Fract");
4326 return;
4327
59727473
DD
4328 case DEMANGLE_COMPONENT_ARGLIST:
4329 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
1c08f2c8 4330 if (d_left (dc) != NULL)
ddee5e46 4331 d_print_comp (dpi, options, d_left (dc));
d00edca5
DD
4332 if (d_right (dc) != NULL)
4333 {
4e59450e 4334 size_t len;
3baae9d6
JJ
4335 unsigned long int flush_count;
4336 /* Make sure ", " isn't flushed by d_append_string, otherwise
4337 dpi->len -= 2 wouldn't work. */
4338 if (dpi->len >= sizeof (dpi->buf) - 2)
4339 d_print_flush (dpi);
208c1674 4340 d_append_string (dpi, ", ");
4e59450e 4341 len = dpi->len;
3baae9d6 4342 flush_count = dpi->flush_count;
ddee5e46 4343 d_print_comp (dpi, options, d_right (dc));
4e59450e
DD
4344 /* If that didn't print anything (which can happen with empty
4345 template argument packs), remove the comma and space. */
3baae9d6 4346 if (dpi->flush_count == flush_count && dpi->len == len)
4e59450e 4347 dpi->len -= 2;
d00edca5
DD
4348 }
4349 return;
eb383413 4350
eb7b5ddb
DD
4351 case DEMANGLE_COMPONENT_INITIALIZER_LIST:
4352 {
4353 struct demangle_component *type = d_left (dc);
4354 struct demangle_component *list = d_right (dc);
4355
4356 if (type)
4357 d_print_comp (dpi, options, type);
4358 d_append_char (dpi, '{');
4359 d_print_comp (dpi, options, list);
4360 d_append_char (dpi, '}');
4361 }
4362 return;
4363
59727473 4364 case DEMANGLE_COMPONENT_OPERATOR:
d00edca5 4365 {
fbfd63c0
DD
4366 const struct demangle_operator_info *op = dc->u.s_operator.op;
4367 int len = op->len;
d00edca5 4368
208c1674 4369 d_append_string (dpi, "operator");
fbfd63c0
DD
4370 /* Add a space before new/delete. */
4371 if (IS_LOWER (op->name[0]))
d00edca5 4372 d_append_char (dpi, ' ');
fbfd63c0
DD
4373 /* Omit a trailing space. */
4374 if (op->name[len-1] == ' ')
4375 --len;
4376 d_append_buffer (dpi, op->name, len);
d00edca5
DD
4377 return;
4378 }
eb383413 4379
59727473 4380 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
208c1674 4381 d_append_string (dpi, "operator ");
ddee5e46 4382 d_print_comp (dpi, options, dc->u.s_extended_operator.name);
d00edca5 4383 return;
eb383413 4384
59727473 4385 case DEMANGLE_COMPONENT_CAST:
208c1674 4386 d_append_string (dpi, "operator ");
ddee5e46 4387 d_print_cast (dpi, options, dc);
d00edca5 4388 return;
eb383413 4389
eb7b5ddb
DD
4390 case DEMANGLE_COMPONENT_NULLARY:
4391 d_print_expr_op (dpi, options, d_left (dc));
4392 return;
4393
59727473 4394 case DEMANGLE_COMPONENT_UNARY:
eb7b5ddb
DD
4395 {
4396 struct demangle_component *op = d_left (dc);
4397 struct demangle_component *operand = d_right (dc);
4398 const char *code = NULL;
02e7efbf 4399
eb7b5ddb
DD
4400 if (op->type == DEMANGLE_COMPONENT_OPERATOR)
4401 {
4402 code = op->u.s_operator.op->code;
4403 if (!strcmp (code, "ad"))
4404 {
4405 /* Don't print the argument list for the address of a
4406 function. */
4407 if (operand->type == DEMANGLE_COMPONENT_TYPED_NAME
4408 && d_left (operand)->type == DEMANGLE_COMPONENT_QUAL_NAME
4409 && d_right (operand)->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
4410 operand = d_left (operand);
4411 }
4412 if (operand->type == DEMANGLE_COMPONENT_BINARY_ARGS)
4413 {
4414 /* This indicates a suffix operator. */
4415 operand = d_left (operand);
4416 d_print_subexpr (dpi, options, operand);
4417 d_print_expr_op (dpi, options, op);
4418 return;
4419 }
4420 }
02e7efbf 4421
eb7b5ddb
DD
4422 if (op->type != DEMANGLE_COMPONENT_CAST)
4423 d_print_expr_op (dpi, options, op);
4424 else
4425 {
4426 d_append_char (dpi, '(');
4427 d_print_cast (dpi, options, op);
4428 d_append_char (dpi, ')');
4429 }
4430 if (code && !strcmp (code, "gs"))
4431 /* Avoid parens after '::'. */
4432 d_print_comp (dpi, options, operand);
4433 else if (code && !strcmp (code, "st"))
4434 /* Always print parens for sizeof (type). */
4435 {
4436 d_append_char (dpi, '(');
4437 d_print_comp (dpi, options, operand);
4438 d_append_char (dpi, ')');
4439 }
4440 else
4441 d_print_subexpr (dpi, options, operand);
4442 }
d00edca5
DD
4443 return;
4444
59727473
DD
4445 case DEMANGLE_COMPONENT_BINARY:
4446 if (d_right (dc)->type != DEMANGLE_COMPONENT_BINARY_ARGS)
eb383413 4447 {
d00edca5
DD
4448 d_print_error (dpi);
4449 return;
eb383413 4450 }
858b45cf
DD
4451
4452 /* We wrap an expression which uses the greater-than operator in
4453 an extra layer of parens so that it does not get confused
4454 with the '>' which ends the template parameters. */
59727473 4455 if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
b6fb00c0
DD
4456 && d_left (dc)->u.s_operator.op->len == 1
4457 && d_left (dc)->u.s_operator.op->name[0] == '>')
858b45cf
DD
4458 d_append_char (dpi, '(');
4459
02e7efbf
JK
4460 if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") == 0
4461 && d_left (d_right (dc))->type == DEMANGLE_COMPONENT_TYPED_NAME)
4462 {
4463 /* Function call used in an expression should not have printed types
4464 of the function arguments. Values of the function arguments still
4465 get printed below. */
4466
4467 const struct demangle_component *func = d_left (d_right (dc));
4468
4469 if (d_right (func)->type != DEMANGLE_COMPONENT_FUNCTION_TYPE)
4470 d_print_error (dpi);
4471 d_print_subexpr (dpi, options, d_left (func));
4472 }
4473 else
4474 d_print_subexpr (dpi, options, d_left (d_right (dc)));
9ac9c2b6
DD
4475 if (strcmp (d_left (dc)->u.s_operator.op->code, "ix") == 0)
4476 {
4477 d_append_char (dpi, '[');
ddee5e46 4478 d_print_comp (dpi, options, d_right (d_right (dc)));
9ac9c2b6
DD
4479 d_append_char (dpi, ']');
4480 }
4481 else
4482 {
4483 if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") != 0)
ddee5e46
DD
4484 d_print_expr_op (dpi, options, d_left (dc));
4485 d_print_subexpr (dpi, options, d_right (d_right (dc)));
9ac9c2b6 4486 }
858b45cf 4487
59727473 4488 if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
b6fb00c0
DD
4489 && d_left (dc)->u.s_operator.op->len == 1
4490 && d_left (dc)->u.s_operator.op->name[0] == '>')
858b45cf
DD
4491 d_append_char (dpi, ')');
4492
d00edca5
DD
4493 return;
4494
59727473
DD
4495 case DEMANGLE_COMPONENT_BINARY_ARGS:
4496 /* We should only see this as part of DEMANGLE_COMPONENT_BINARY. */
d00edca5
DD
4497 d_print_error (dpi);
4498 return;
4499
59727473
DD
4500 case DEMANGLE_COMPONENT_TRINARY:
4501 if (d_right (dc)->type != DEMANGLE_COMPONENT_TRINARY_ARG1
4502 || d_right (d_right (dc))->type != DEMANGLE_COMPONENT_TRINARY_ARG2)
d00edca5
DD
4503 {
4504 d_print_error (dpi);
4505 return;
4506 }
eb7b5ddb
DD
4507 {
4508 struct demangle_component *op = d_left (dc);
4509 struct demangle_component *first = d_left (d_right (dc));
4510 struct demangle_component *second = d_left (d_right (d_right (dc)));
4511 struct demangle_component *third = d_right (d_right (d_right (dc)));
4512
4513 if (!strcmp (op->u.s_operator.op->code, "qu"))
4514 {
4515 d_print_subexpr (dpi, options, first);
4516 d_print_expr_op (dpi, options, op);
4517 d_print_subexpr (dpi, options, second);
4518 d_append_string (dpi, " : ");
4519 d_print_subexpr (dpi, options, third);
4520 }
4521 else
4522 {
4523 d_append_string (dpi, "new ");
4524 if (d_left (first) != NULL)
4525 {
4526 d_print_subexpr (dpi, options, first);
4527 d_append_char (dpi, ' ');
4528 }
4529 d_print_comp (dpi, options, second);
4530 if (third)
4531 d_print_subexpr (dpi, options, third);
4532 }
4533 }
d00edca5
DD
4534 return;
4535
59727473
DD
4536 case DEMANGLE_COMPONENT_TRINARY_ARG1:
4537 case DEMANGLE_COMPONENT_TRINARY_ARG2:
4538 /* We should only see these are part of DEMANGLE_COMPONENT_TRINARY. */
d00edca5
DD
4539 d_print_error (dpi);
4540 return;
4541
59727473
DD
4542 case DEMANGLE_COMPONENT_LITERAL:
4543 case DEMANGLE_COMPONENT_LITERAL_NEG:
2d733211
DD
4544 {
4545 enum d_builtin_type_print tp;
d00edca5 4546
2d733211
DD
4547 /* For some builtin types, produce simpler output. */
4548 tp = D_PRINT_DEFAULT;
4549 if (d_left (dc)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE)
4550 {
4551 tp = d_left (dc)->u.s_builtin.type->print;
4552 switch (tp)
4553 {
4554 case D_PRINT_INT:
4555 case D_PRINT_UNSIGNED:
4556 case D_PRINT_LONG:
4557 case D_PRINT_UNSIGNED_LONG:
4558 case D_PRINT_LONG_LONG:
4559 case D_PRINT_UNSIGNED_LONG_LONG:
4560 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME)
4561 {
4562 if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
4563 d_append_char (dpi, '-');
ddee5e46 4564 d_print_comp (dpi, options, d_right (dc));
2d733211
DD
4565 switch (tp)
4566 {
4567 default:
4568 break;
4569 case D_PRINT_UNSIGNED:
4570 d_append_char (dpi, 'u');
4571 break;
4572 case D_PRINT_LONG:
4573 d_append_char (dpi, 'l');
4574 break;
4575 case D_PRINT_UNSIGNED_LONG:
208c1674 4576 d_append_string (dpi, "ul");
2d733211
DD
4577 break;
4578 case D_PRINT_LONG_LONG:
208c1674 4579 d_append_string (dpi, "ll");
2d733211
DD
4580 break;
4581 case D_PRINT_UNSIGNED_LONG_LONG:
208c1674 4582 d_append_string (dpi, "ull");
2d733211
DD
4583 break;
4584 }
4585 return;
4586 }
4587 break;
eb383413 4588
2d733211
DD
4589 case D_PRINT_BOOL:
4590 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME
4591 && d_right (dc)->u.s_name.len == 1
4592 && dc->type == DEMANGLE_COMPONENT_LITERAL)
4593 {
4594 switch (d_right (dc)->u.s_name.s[0])
4595 {
4596 case '0':
208c1674 4597 d_append_string (dpi, "false");
2d733211
DD
4598 return;
4599 case '1':
208c1674 4600 d_append_string (dpi, "true");
2d733211
DD
4601 return;
4602 default:
4603 break;
4604 }
4605 }
4606 break;
03d5f569 4607
2d733211
DD
4608 default:
4609 break;
4610 }
4611 }
eb383413 4612
2d733211 4613 d_append_char (dpi, '(');
ddee5e46 4614 d_print_comp (dpi, options, d_left (dc));
2d733211
DD
4615 d_append_char (dpi, ')');
4616 if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
4617 d_append_char (dpi, '-');
4618 if (tp == D_PRINT_FLOAT)
4619 d_append_char (dpi, '[');
ddee5e46 4620 d_print_comp (dpi, options, d_right (dc));
2d733211
DD
4621 if (tp == D_PRINT_FLOAT)
4622 d_append_char (dpi, ']');
4623 }
d00edca5 4624 return;
eb383413 4625
cbc43128
DD
4626 case DEMANGLE_COMPONENT_NUMBER:
4627 d_append_num (dpi, dc->u.s_number.number);
4628 return;
4629
830ef634
DD
4630 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
4631 d_append_string (dpi, "java resource ");
ddee5e46 4632 d_print_comp (dpi, options, d_left (dc));
830ef634
DD
4633 return;
4634
4635 case DEMANGLE_COMPONENT_COMPOUND_NAME:
ddee5e46
DD
4636 d_print_comp (dpi, options, d_left (dc));
4637 d_print_comp (dpi, options, d_right (dc));
830ef634
DD
4638 return;
4639
4640 case DEMANGLE_COMPONENT_CHARACTER:
4641 d_append_char (dpi, dc->u.s_character.character);
4642 return;
4643
ba8cb4ba
DD
4644 case DEMANGLE_COMPONENT_DECLTYPE:
4645 d_append_string (dpi, "decltype (");
ddee5e46 4646 d_print_comp (dpi, options, d_left (dc));
ba8cb4ba
DD
4647 d_append_char (dpi, ')');
4648 return;
4649
1c08f2c8
DD
4650 case DEMANGLE_COMPONENT_PACK_EXPANSION:
4651 {
e2e1864d 4652 int len;
1c08f2c8 4653 int i;
e2e1864d
DD
4654 struct demangle_component *a = d_find_pack (dpi, d_left (dc));
4655 if (a == NULL)
4656 {
4657 /* d_find_pack won't find anything if the only packs involved
4658 in this expansion are function parameter packs; in that
4659 case, just print the pattern and "...". */
ddee5e46 4660 d_print_subexpr (dpi, options, d_left (dc));
e2e1864d
DD
4661 d_append_string (dpi, "...");
4662 return;
4663 }
1c08f2c8 4664
e2e1864d 4665 len = d_pack_length (a);
1c08f2c8
DD
4666 dc = d_left (dc);
4667 for (i = 0; i < len; ++i)
4668 {
4669 dpi->pack_index = i;
ddee5e46 4670 d_print_comp (dpi, options, dc);
1c08f2c8
DD
4671 if (i < len-1)
4672 d_append_string (dpi, ", ");
4673 }
4674 }
4675 return;
4676
c743cf5d 4677 case DEMANGLE_COMPONENT_FUNCTION_PARAM:
f2917a30
DD
4678 {
4679 long num = dc->u.s_number.number;
4680 if (num == 0)
4681 d_append_string (dpi, "this");
4682 else
4683 {
4684 d_append_string (dpi, "{parm#");
4685 d_append_num (dpi, num);
4686 d_append_char (dpi, '}');
4687 }
4688 }
664aa91f 4689 return;
c743cf5d 4690
d5031754
DD
4691 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
4692 d_append_string (dpi, "global constructors keyed to ");
ddee5e46 4693 d_print_comp (dpi, options, dc->u.s_binary.left);
d5031754
DD
4694 return;
4695
4696 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
4697 d_append_string (dpi, "global destructors keyed to ");
ddee5e46 4698 d_print_comp (dpi, options, dc->u.s_binary.left);
d5031754
DD
4699 return;
4700
664aa91f
DD
4701 case DEMANGLE_COMPONENT_LAMBDA:
4702 d_append_string (dpi, "{lambda(");
ddee5e46 4703 d_print_comp (dpi, options, dc->u.s_unary_num.sub);
664aa91f
DD
4704 d_append_string (dpi, ")#");
4705 d_append_num (dpi, dc->u.s_unary_num.num + 1);
4706 d_append_char (dpi, '}');
4707 return;
4708
4709 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
4710 d_append_string (dpi, "{unnamed type#");
4711 d_append_num (dpi, dc->u.s_number.number + 1);
4712 d_append_char (dpi, '}');
4713 return;
4714
7955ede5
DD
4715 case DEMANGLE_COMPONENT_CLONE:
4716 d_print_comp (dpi, options, d_left (dc));
4717 d_append_string (dpi, " [clone ");
4718 d_print_comp (dpi, options, d_right (dc));
4719 d_append_char (dpi, ']');
4720 return;
4721
d00edca5
DD
4722 default:
4723 d_print_error (dpi);
4724 return;
4725 }
eb383413
L
4726}
4727
b6fb00c0
DD
4728/* Print a Java dentifier. For Java we try to handle encoded extended
4729 Unicode characters. The C++ ABI doesn't mention Unicode encoding,
4730 so we don't it for C++. Characters are encoded as
4731 __U<hex-char>+_. */
eb383413 4732
d00edca5 4733static void
9334f9c6 4734d_print_java_identifier (struct d_print_info *dpi, const char *name, int len)
eb383413 4735{
b6fb00c0
DD
4736 const char *p;
4737 const char *end;
eb383413 4738
b6fb00c0
DD
4739 end = name + len;
4740 for (p = name; p < end; ++p)
4741 {
4742 if (end - p > 3
4743 && p[0] == '_'
4744 && p[1] == '_'
4745 && p[2] == 'U')
eb383413 4746 {
b6fb00c0
DD
4747 unsigned long c;
4748 const char *q;
4749
4750 c = 0;
4751 for (q = p + 3; q < end; ++q)
d00edca5 4752 {
b6fb00c0
DD
4753 int dig;
4754
4755 if (IS_DIGIT (*q))
4756 dig = *q - '0';
4757 else if (*q >= 'A' && *q <= 'F')
4758 dig = *q - 'A' + 10;
4759 else if (*q >= 'a' && *q <= 'f')
4760 dig = *q - 'a' + 10;
4761 else
4762 break;
eb383413 4763
b6fb00c0
DD
4764 c = c * 16 + dig;
4765 }
4766 /* If the Unicode character is larger than 256, we don't try
4767 to deal with it here. FIXME. */
4768 if (q < end && *q == '_' && c < 256)
4769 {
4770 d_append_char (dpi, c);
4771 p = q;
4772 continue;
d00edca5 4773 }
d00edca5 4774 }
b6fb00c0
DD
4775
4776 d_append_char (dpi, *p);
eb383413 4777 }
eb383413
L
4778}
4779
858b45cf
DD
4780/* Print a list of modifiers. SUFFIX is 1 if we are printing
4781 qualifiers on this after printing a function. */
eb383413 4782
d00edca5 4783static void
ddee5e46 4784d_print_mod_list (struct d_print_info *dpi, int options,
9334f9c6 4785 struct d_print_mod *mods, int suffix)
eb383413 4786{
331c3da2
DD
4787 struct d_print_template *hold_dpt;
4788
858b45cf 4789 if (mods == NULL || d_print_saw_error (dpi))
d00edca5 4790 return;
eb383413 4791
858b45cf
DD
4792 if (mods->printed
4793 || (! suffix
59727473
DD
4794 && (mods->mod->type == DEMANGLE_COMPONENT_RESTRICT_THIS
4795 || mods->mod->type == DEMANGLE_COMPONENT_VOLATILE_THIS
4796 || mods->mod->type == DEMANGLE_COMPONENT_CONST_THIS)))
858b45cf 4797 {
ddee5e46 4798 d_print_mod_list (dpi, options, mods->next, suffix);
858b45cf
DD
4799 return;
4800 }
4801
331c3da2
DD
4802 mods->printed = 1;
4803
4804 hold_dpt = dpi->templates;
4805 dpi->templates = mods->templates;
4806
59727473 4807 if (mods->mod->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
eb383413 4808 {
ddee5e46 4809 d_print_function_type (dpi, options, mods->mod, mods->next);
331c3da2 4810 dpi->templates = hold_dpt;
d00edca5
DD
4811 return;
4812 }
59727473 4813 else if (mods->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
d00edca5 4814 {
ddee5e46 4815 d_print_array_type (dpi, options, mods->mod, mods->next);
331c3da2 4816 dpi->templates = hold_dpt;
d00edca5
DD
4817 return;
4818 }
59727473 4819 else if (mods->mod->type == DEMANGLE_COMPONENT_LOCAL_NAME)
d4edd112
DD
4820 {
4821 struct d_print_mod *hold_modifiers;
59727473 4822 struct demangle_component *dc;
d4edd112
DD
4823
4824 /* When this is on the modifier stack, we have pulled any
4825 qualifiers off the right argument already. Otherwise, we
4826 print it as usual, but don't let the left argument see any
4827 modifiers. */
4828
4829 hold_modifiers = dpi->modifiers;
4830 dpi->modifiers = NULL;
ddee5e46 4831 d_print_comp (dpi, options, d_left (mods->mod));
d4edd112
DD
4832 dpi->modifiers = hold_modifiers;
4833
ddee5e46 4834 if ((options & DMGL_JAVA) == 0)
208c1674 4835 d_append_string (dpi, "::");
b6fb00c0
DD
4836 else
4837 d_append_char (dpi, '.');
d4edd112
DD
4838
4839 dc = d_right (mods->mod);
664aa91f
DD
4840
4841 if (dc->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
4842 {
4843 d_append_string (dpi, "{default arg#");
4844 d_append_num (dpi, dc->u.s_unary_num.num + 1);
4845 d_append_string (dpi, "}::");
4846 dc = dc->u.s_unary_num.sub;
4847 }
4848
59727473
DD
4849 while (dc->type == DEMANGLE_COMPONENT_RESTRICT_THIS
4850 || dc->type == DEMANGLE_COMPONENT_VOLATILE_THIS
4851 || dc->type == DEMANGLE_COMPONENT_CONST_THIS)
d4edd112
DD
4852 dc = d_left (dc);
4853
ddee5e46 4854 d_print_comp (dpi, options, dc);
d4edd112
DD
4855
4856 dpi->templates = hold_dpt;
4857 return;
4858 }
eb383413 4859
ddee5e46 4860 d_print_mod (dpi, options, mods->mod);
eb383413 4861
331c3da2
DD
4862 dpi->templates = hold_dpt;
4863
ddee5e46 4864 d_print_mod_list (dpi, options, mods->next, suffix);
eb383413 4865}
331c3da2 4866
d00edca5 4867/* Print a modifier. */
eb383413 4868
d00edca5 4869static void
ddee5e46 4870d_print_mod (struct d_print_info *dpi, int options,
9334f9c6 4871 const struct demangle_component *mod)
d00edca5
DD
4872{
4873 switch (mod->type)
4874 {
59727473
DD
4875 case DEMANGLE_COMPONENT_RESTRICT:
4876 case DEMANGLE_COMPONENT_RESTRICT_THIS:
208c1674 4877 d_append_string (dpi, " restrict");
d00edca5 4878 return;
59727473
DD
4879 case DEMANGLE_COMPONENT_VOLATILE:
4880 case DEMANGLE_COMPONENT_VOLATILE_THIS:
208c1674 4881 d_append_string (dpi, " volatile");
d00edca5 4882 return;
59727473
DD
4883 case DEMANGLE_COMPONENT_CONST:
4884 case DEMANGLE_COMPONENT_CONST_THIS:
208c1674 4885 d_append_string (dpi, " const");
d00edca5 4886 return;
59727473 4887 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
d00edca5 4888 d_append_char (dpi, ' ');
ddee5e46 4889 d_print_comp (dpi, options, d_right (mod));
d00edca5 4890 return;
59727473 4891 case DEMANGLE_COMPONENT_POINTER:
d00edca5 4892 /* There is no pointer symbol in Java. */
ddee5e46 4893 if ((options & DMGL_JAVA) == 0)
d00edca5
DD
4894 d_append_char (dpi, '*');
4895 return;
59727473 4896 case DEMANGLE_COMPONENT_REFERENCE:
d00edca5
DD
4897 d_append_char (dpi, '&');
4898 return;
8969a67f
DD
4899 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
4900 d_append_string (dpi, "&&");
4901 return;
59727473 4902 case DEMANGLE_COMPONENT_COMPLEX:
208c1674 4903 d_append_string (dpi, "complex ");
d00edca5 4904 return;
59727473 4905 case DEMANGLE_COMPONENT_IMAGINARY:
208c1674 4906 d_append_string (dpi, "imaginary ");
d00edca5 4907 return;
59727473 4908 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
858b45cf 4909 if (d_last_char (dpi) != '(')
d00edca5 4910 d_append_char (dpi, ' ');
ddee5e46 4911 d_print_comp (dpi, options, d_left (mod));
208c1674 4912 d_append_string (dpi, "::*");
d00edca5 4913 return;
59727473 4914 case DEMANGLE_COMPONENT_TYPED_NAME:
ddee5e46 4915 d_print_comp (dpi, options, d_left (mod));
d00edca5 4916 return;
cbc43128 4917 case DEMANGLE_COMPONENT_VECTOR_TYPE:
f9b58c5b 4918 d_append_string (dpi, " __vector(");
ddee5e46 4919 d_print_comp (dpi, options, d_left (mod));
f9b58c5b 4920 d_append_char (dpi, ')');
cbc43128
DD
4921 return;
4922
d00edca5
DD
4923 default:
4924 /* Otherwise, we have something that won't go back on the
4925 modifier stack, so we can just print it. */
ddee5e46 4926 d_print_comp (dpi, options, mod);
d00edca5
DD
4927 return;
4928 }
4929}
eb383413 4930
d00edca5 4931/* Print a function type, except for the return type. */
eb383413 4932
d00edca5 4933static void
ddee5e46 4934d_print_function_type (struct d_print_info *dpi, int options,
9334f9c6
DD
4935 const struct demangle_component *dc,
4936 struct d_print_mod *mods)
eb383413 4937{
331c3da2 4938 int need_paren;
2d733211 4939 int need_space;
331c3da2 4940 struct d_print_mod *p;
d4edd112 4941 struct d_print_mod *hold_modifiers;
331c3da2
DD
4942
4943 need_paren = 0;
2d733211 4944 need_space = 0;
331c3da2 4945 for (p = mods; p != NULL; p = p->next)
d00edca5 4946 {
331c3da2
DD
4947 if (p->printed)
4948 break;
eb383413 4949
331c3da2 4950 switch (p->mod->type)
d00edca5 4951 {
2d733211
DD
4952 case DEMANGLE_COMPONENT_POINTER:
4953 case DEMANGLE_COMPONENT_REFERENCE:
8969a67f 4954 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
2d733211
DD
4955 need_paren = 1;
4956 break;
59727473
DD
4957 case DEMANGLE_COMPONENT_RESTRICT:
4958 case DEMANGLE_COMPONENT_VOLATILE:
4959 case DEMANGLE_COMPONENT_CONST:
4960 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
59727473
DD
4961 case DEMANGLE_COMPONENT_COMPLEX:
4962 case DEMANGLE_COMPONENT_IMAGINARY:
4963 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
2d733211 4964 need_space = 1;
331c3da2
DD
4965 need_paren = 1;
4966 break;
59727473
DD
4967 case DEMANGLE_COMPONENT_RESTRICT_THIS:
4968 case DEMANGLE_COMPONENT_VOLATILE_THIS:
4969 case DEMANGLE_COMPONENT_CONST_THIS:
858b45cf 4970 break;
331c3da2
DD
4971 default:
4972 break;
d00edca5 4973 }
331c3da2
DD
4974 if (need_paren)
4975 break;
4976 }
eb383413 4977
331c3da2 4978 if (need_paren)
858b45cf 4979 {
2d733211 4980 if (! need_space)
858b45cf 4981 {
2d733211
DD
4982 if (d_last_char (dpi) != '('
4983 && d_last_char (dpi) != '*')
4984 need_space = 1;
858b45cf 4985 }
2d733211
DD
4986 if (need_space && d_last_char (dpi) != ' ')
4987 d_append_char (dpi, ' ');
858b45cf
DD
4988 d_append_char (dpi, '(');
4989 }
eb383413 4990
d4edd112
DD
4991 hold_modifiers = dpi->modifiers;
4992 dpi->modifiers = NULL;
4993
ddee5e46 4994 d_print_mod_list (dpi, options, mods, 0);
eb383413 4995
331c3da2
DD
4996 if (need_paren)
4997 d_append_char (dpi, ')');
eb383413 4998
d00edca5 4999 d_append_char (dpi, '(');
eb383413 5000
d00edca5 5001 if (d_right (dc) != NULL)
ddee5e46 5002 d_print_comp (dpi, options, d_right (dc));
eb383413 5003
d00edca5 5004 d_append_char (dpi, ')');
858b45cf 5005
ddee5e46 5006 d_print_mod_list (dpi, options, mods, 1);
d4edd112
DD
5007
5008 dpi->modifiers = hold_modifiers;
d00edca5 5009}
eb383413 5010
d00edca5 5011/* Print an array type, except for the element type. */
eb383413 5012
d00edca5 5013static void
ddee5e46 5014d_print_array_type (struct d_print_info *dpi, int options,
9334f9c6
DD
5015 const struct demangle_component *dc,
5016 struct d_print_mod *mods)
d00edca5
DD
5017{
5018 int need_space;
eb383413 5019
d00edca5
DD
5020 need_space = 1;
5021 if (mods != NULL)
eb383413 5022 {
d00edca5
DD
5023 int need_paren;
5024 struct d_print_mod *p;
03d5f569 5025
d00edca5
DD
5026 need_paren = 0;
5027 for (p = mods; p != NULL; p = p->next)
eb383413 5028 {
74aee4eb 5029 if (! p->printed)
eb383413 5030 {
74aee4eb
DD
5031 if (p->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
5032 {
5033 need_space = 0;
5034 break;
5035 }
5036 else
5037 {
5038 need_paren = 1;
5039 need_space = 1;
5040 break;
5041 }
eb383413 5042 }
d00edca5 5043 }
eb383413 5044
d00edca5 5045 if (need_paren)
208c1674 5046 d_append_string (dpi, " (");
eb383413 5047
ddee5e46 5048 d_print_mod_list (dpi, options, mods, 0);
eb383413 5049
d00edca5
DD
5050 if (need_paren)
5051 d_append_char (dpi, ')');
5052 }
eb383413 5053
d00edca5
DD
5054 if (need_space)
5055 d_append_char (dpi, ' ');
03d5f569 5056
d00edca5 5057 d_append_char (dpi, '[');
03d5f569 5058
d00edca5 5059 if (d_left (dc) != NULL)
ddee5e46 5060 d_print_comp (dpi, options, d_left (dc));
eb383413 5061
d00edca5
DD
5062 d_append_char (dpi, ']');
5063}
eb383413 5064
d00edca5 5065/* Print an operator in an expression. */
eb383413 5066
d00edca5 5067static void
ddee5e46 5068d_print_expr_op (struct d_print_info *dpi, int options,
9334f9c6 5069 const struct demangle_component *dc)
d00edca5 5070{
59727473 5071 if (dc->type == DEMANGLE_COMPONENT_OPERATOR)
b6fb00c0
DD
5072 d_append_buffer (dpi, dc->u.s_operator.op->name,
5073 dc->u.s_operator.op->len);
d00edca5 5074 else
ddee5e46 5075 d_print_comp (dpi, options, dc);
eb383413
L
5076}
5077
d00edca5 5078/* Print a cast. */
eb383413 5079
d00edca5 5080static void
ddee5e46 5081d_print_cast (struct d_print_info *dpi, int options,
9334f9c6 5082 const struct demangle_component *dc)
eb383413 5083{
59727473 5084 if (d_left (dc)->type != DEMANGLE_COMPONENT_TEMPLATE)
ddee5e46 5085 d_print_comp (dpi, options, d_left (dc));
d00edca5
DD
5086 else
5087 {
331c3da2 5088 struct d_print_mod *hold_dpm;
d00edca5 5089 struct d_print_template dpt;
0976f6a7 5090
d00edca5
DD
5091 /* It appears that for a templated cast operator, we need to put
5092 the template parameters in scope for the operator name, but
5093 not for the parameters. The effect is that we need to handle
24afc00d 5094 the template printing here. */
eb383413 5095
331c3da2
DD
5096 hold_dpm = dpi->modifiers;
5097 dpi->modifiers = NULL;
5098
d00edca5
DD
5099 dpt.next = dpi->templates;
5100 dpi->templates = &dpt;
abf6a75b 5101 dpt.template_decl = d_left (dc);
0976f6a7 5102
ddee5e46 5103 d_print_comp (dpi, options, d_left (d_left (dc)));
0976f6a7 5104
d00edca5 5105 dpi->templates = dpt.next;
eb383413 5106
858b45cf
DD
5107 if (d_last_char (dpi) == '<')
5108 d_append_char (dpi, ' ');
d00edca5 5109 d_append_char (dpi, '<');
ddee5e46 5110 d_print_comp (dpi, options, d_right (d_left (dc)));
d00edca5
DD
5111 /* Avoid generating two consecutive '>' characters, to avoid
5112 the C++ syntactic ambiguity. */
858b45cf 5113 if (d_last_char (dpi) == '>')
d00edca5
DD
5114 d_append_char (dpi, ' ');
5115 d_append_char (dpi, '>');
331c3da2
DD
5116
5117 dpi->modifiers = hold_dpm;
eb383413 5118 }
d00edca5
DD
5119}
5120
5121/* Initialize the information structure we use to pass around
5122 information. */
5123
59727473
DD
5124CP_STATIC_IF_GLIBCPP_V3
5125void
9334f9c6
DD
5126cplus_demangle_init_info (const char *mangled, int options, size_t len,
5127 struct d_info *di)
eb383413 5128{
d00edca5 5129 di->s = mangled;
b6fb00c0 5130 di->send = mangled + len;
d00edca5 5131 di->options = options;
eb383413 5132
d00edca5
DD
5133 di->n = mangled;
5134
5135 /* We can not need more components than twice the number of chars in
5136 the mangled string. Most components correspond directly to
5137 chars, but the ARGLIST types are exceptions. */
5138 di->num_comps = 2 * len;
d00edca5
DD
5139 di->next_comp = 0;
5140
5141 /* Similarly, we can not need more substitutions than there are
331c3da2
DD
5142 chars in the mangled string. */
5143 di->num_subs = len;
d00edca5 5144 di->next_sub = 0;
b6fb00c0 5145 di->did_subs = 0;
d00edca5
DD
5146
5147 di->last_name = NULL;
5148
b6fb00c0 5149 di->expansion = 0;
eb383413
L
5150}
5151
208c1674
DD
5152/* Internal implementation for the demangler. If MANGLED is a g++ v3 ABI
5153 mangled name, return strings in repeated callback giving the demangled
5154 name. OPTIONS is the usual libiberty demangler options. On success,
5155 this returns 1. On failure, returns 0. */
eb383413 5156
208c1674
DD
5157static int
5158d_demangle_callback (const char *mangled, int options,
5159 demangle_callbackref callback, void *opaque)
eb383413 5160{
d5031754
DD
5161 enum
5162 {
5163 DCT_TYPE,
5164 DCT_MANGLED,
5165 DCT_GLOBAL_CTORS,
5166 DCT_GLOBAL_DTORS
5167 }
5168 type;
d00edca5 5169 struct d_info di;
59727473 5170 struct demangle_component *dc;
208c1674 5171 int status;
d00edca5
DD
5172
5173 if (mangled[0] == '_' && mangled[1] == 'Z')
d5031754 5174 type = DCT_MANGLED;
d00edca5
DD
5175 else if (strncmp (mangled, "_GLOBAL_", 8) == 0
5176 && (mangled[8] == '.' || mangled[8] == '_' || mangled[8] == '$')
5177 && (mangled[9] == 'D' || mangled[9] == 'I')
5178 && mangled[10] == '_')
d5031754 5179 type = mangled[9] == 'I' ? DCT_GLOBAL_CTORS : DCT_GLOBAL_DTORS;
eb383413
L
5180 else
5181 {
d00edca5 5182 if ((options & DMGL_TYPES) == 0)
208c1674 5183 return 0;
d5031754 5184 type = DCT_TYPE;
eb383413
L
5185 }
5186
208c1674 5187 cplus_demangle_init_info (mangled, options, strlen (mangled), &di);
03d5f569 5188
b6fb00c0
DD
5189 {
5190#ifdef CP_DYNAMIC_ARRAYS
59727473
DD
5191 __extension__ struct demangle_component comps[di.num_comps];
5192 __extension__ struct demangle_component *subs[di.num_subs];
b6fb00c0 5193
208c1674
DD
5194 di.comps = comps;
5195 di.subs = subs;
b6fb00c0 5196#else
208c1674
DD
5197 di.comps = alloca (di.num_comps * sizeof (*di.comps));
5198 di.subs = alloca (di.num_subs * sizeof (*di.subs));
b6fb00c0
DD
5199#endif
5200
d5031754
DD
5201 switch (type)
5202 {
5203 case DCT_TYPE:
5204 dc = cplus_demangle_type (&di);
5205 break;
5206 case DCT_MANGLED:
5207 dc = cplus_demangle_mangled_name (&di, 1);
5208 break;
5209 case DCT_GLOBAL_CTORS:
5210 case DCT_GLOBAL_DTORS:
5211 d_advance (&di, 11);
5212 dc = d_make_comp (&di,
5213 (type == DCT_GLOBAL_CTORS
5214 ? DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
5215 : DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS),
a0692e36 5216 d_make_demangle_mangled_name (&di, d_str (&di)),
d5031754
DD
5217 NULL);
5218 d_advance (&di, strlen (d_str (&di)));
5219 break;
5220 }
d00edca5 5221
b6fb00c0
DD
5222 /* If DMGL_PARAMS is set, then if we didn't consume the entire
5223 mangled string, then we didn't successfully demangle it. If
5224 DMGL_PARAMS is not set, we didn't look at the trailing
5225 parameters. */
5226 if (((options & DMGL_PARAMS) != 0) && d_peek_char (&di) != '\0')
5227 dc = NULL;
24afc00d 5228
d00edca5 5229#ifdef CP_DEMANGLE_DEBUG
208c1674 5230 d_dump (dc, 0);
d00edca5
DD
5231#endif
5232
208c1674
DD
5233 status = (dc != NULL)
5234 ? cplus_demangle_print_callback (options, dc, callback, opaque)
5235 : 0;
5236 }
03d5f569 5237
208c1674
DD
5238 return status;
5239}
03d5f569 5240
208c1674
DD
5241/* Entry point for the demangler. If MANGLED is a g++ v3 ABI mangled
5242 name, return a buffer allocated with malloc holding the demangled
5243 name. OPTIONS is the usual libiberty demangler options. On
5244 success, this sets *PALC to the allocated size of the returned
5245 buffer. On failure, this sets *PALC to 0 for a bad name, or 1 for
5246 a memory allocation failure, and returns NULL. */
b6fb00c0 5247
208c1674
DD
5248static char *
5249d_demangle (const char *mangled, int options, size_t *palc)
5250{
5251 struct d_growable_string dgs;
5252 int status;
03d5f569 5253
208c1674
DD
5254 d_growable_string_init (&dgs, 0);
5255
5256 status = d_demangle_callback (mangled, options,
5257 d_growable_string_callback_adapter, &dgs);
5258 if (status == 0)
5259 {
5260 free (dgs.buf);
5261 *palc = 0;
5262 return NULL;
5263 }
5264
ffe7cfdf 5265 *palc = dgs.allocation_failure ? 1 : dgs.alc;
208c1674 5266 return dgs.buf;
eb383413
L
5267}
5268
0c4460bb 5269#if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3)
d00edca5 5270
9334f9c6 5271extern char *__cxa_demangle (const char *, char *, size_t *, int *);
03d5f569 5272
d00edca5
DD
5273/* ia64 ABI-mandated entry point in the C++ runtime library for
5274 performing demangling. MANGLED_NAME is a NUL-terminated character
5275 string containing the name to be demangled.
03d5f569
JM
5276
5277 OUTPUT_BUFFER is a region of memory, allocated with malloc, of
5278 *LENGTH bytes, into which the demangled name is stored. If
5279 OUTPUT_BUFFER is not long enough, it is expanded using realloc.
5280 OUTPUT_BUFFER may instead be NULL; in that case, the demangled name
d00edca5 5281 is placed in a region of memory allocated with malloc.
03d5f569 5282
208c1674 5283 If LENGTH is non-NULL, the length of the buffer containing the
d00edca5 5284 demangled name, is placed in *LENGTH.
03d5f569
JM
5285
5286 The return value is a pointer to the start of the NUL-terminated
5287 demangled name, or NULL if the demangling fails. The caller is
d00edca5 5288 responsible for deallocating this memory using free.
03d5f569
JM
5289
5290 *STATUS is set to one of the following values:
5291 0: The demangling operation succeeded.
d00edca5 5292 -1: A memory allocation failure occurred.
03d5f569
JM
5293 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
5294 -3: One of the arguments is invalid.
5295
d00edca5 5296 The demangling is performed using the C++ ABI mangling rules, with
03d5f569
JM
5297 GNU extensions. */
5298
5299char *
9334f9c6
DD
5300__cxa_demangle (const char *mangled_name, char *output_buffer,
5301 size_t *length, int *status)
03d5f569 5302{
d00edca5
DD
5303 char *demangled;
5304 size_t alc;
03d5f569 5305
d00edca5
DD
5306 if (mangled_name == NULL)
5307 {
74aee4eb
DD
5308 if (status != NULL)
5309 *status = -3;
03d5f569
JM
5310 return NULL;
5311 }
03d5f569 5312
d00edca5 5313 if (output_buffer != NULL && length == NULL)
03d5f569 5314 {
74aee4eb
DD
5315 if (status != NULL)
5316 *status = -3;
d00edca5 5317 return NULL;
03d5f569 5318 }
d00edca5 5319
74aee4eb 5320 demangled = d_demangle (mangled_name, DMGL_PARAMS | DMGL_TYPES, &alc);
d00edca5
DD
5321
5322 if (demangled == NULL)
03d5f569 5323 {
74aee4eb
DD
5324 if (status != NULL)
5325 {
5326 if (alc == 1)
5327 *status = -1;
5328 else
5329 *status = -2;
5330 }
03d5f569
JM
5331 return NULL;
5332 }
d00edca5
DD
5333
5334 if (output_buffer == NULL)
5335 {
5336 if (length != NULL)
5337 *length = alc;
5338 }
03d5f569 5339 else
03d5f569 5340 {
d00edca5
DD
5341 if (strlen (demangled) < *length)
5342 {
5343 strcpy (output_buffer, demangled);
5344 free (demangled);
5345 demangled = output_buffer;
5346 }
5347 else
5348 {
5349 free (output_buffer);
5350 *length = alc;
5351 }
03d5f569 5352 }
d00edca5 5353
74aee4eb
DD
5354 if (status != NULL)
5355 *status = 0;
d00edca5
DD
5356
5357 return demangled;
03d5f569
JM
5358}
5359
208c1674
DD
5360extern int __gcclibcxx_demangle_callback (const char *,
5361 void (*)
5362 (const char *, size_t, void *),
5363 void *);
5364
5365/* Alternative, allocationless entry point in the C++ runtime library
5366 for performing demangling. MANGLED_NAME is a NUL-terminated character
5367 string containing the name to be demangled.
5368
5369 CALLBACK is a callback function, called with demangled string
5370 segments as demangling progresses; it is called at least once,
5371 but may be called more than once. OPAQUE is a generalized pointer
5372 used as a callback argument.
5373
5374 The return code is one of the following values, equivalent to
5375 the STATUS values of __cxa_demangle() (excluding -1, since this
5376 function performs no memory allocations):
5377 0: The demangling operation succeeded.
5378 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
5379 -3: One of the arguments is invalid.
5380
5381 The demangling is performed using the C++ ABI mangling rules, with
5382 GNU extensions. */
5383
5384int
5385__gcclibcxx_demangle_callback (const char *mangled_name,
5386 void (*callback) (const char *, size_t, void *),
5387 void *opaque)
5388{
5389 int status;
5390
5391 if (mangled_name == NULL || callback == NULL)
5392 return -3;
5393
5394 status = d_demangle_callback (mangled_name, DMGL_PARAMS | DMGL_TYPES,
5395 callback, opaque);
5396 if (status == 0)
5397 return -2;
5398
5399 return 0;
5400}
5401
0c4460bb 5402#else /* ! (IN_LIBGCC2 || IN_GLIBCPP_V3) */
03d5f569 5403
d00edca5
DD
5404/* Entry point for libiberty demangler. If MANGLED is a g++ v3 ABI
5405 mangled name, return a buffer allocated with malloc holding the
5406 demangled name. Otherwise, return NULL. */
eb383413
L
5407
5408char *
208c1674 5409cplus_demangle_v3 (const char *mangled, int options)
eb383413 5410{
d00edca5 5411 size_t alc;
849ee224 5412
d00edca5 5413 return d_demangle (mangled, options, &alc);
eb383413
L
5414}
5415
208c1674
DD
5416int
5417cplus_demangle_v3_callback (const char *mangled, int options,
5418 demangle_callbackref callback, void *opaque)
5419{
5420 return d_demangle_callback (mangled, options, callback, opaque);
5421}
5422
bc9bf259
DD
5423/* Demangle a Java symbol. Java uses a subset of the V3 ABI C++ mangling
5424 conventions, but the output formatting is a little different.
208c1674
DD
5425 This instructs the C++ demangler not to emit pointer characters ("*"), to
5426 use Java's namespace separator symbol ("." instead of "::"), and to output
5427 JArray<TYPE> as TYPE[]. */
bc9bf259
DD
5428
5429char *
208c1674 5430java_demangle_v3 (const char *mangled)
bc9bf259 5431{
d00edca5 5432 size_t alc;
bc9bf259 5433
208c1674
DD
5434 return d_demangle (mangled, DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX, &alc);
5435}
f2160d2b 5436
208c1674
DD
5437int
5438java_demangle_v3_callback (const char *mangled,
5439 demangle_callbackref callback, void *opaque)
5440{
5441 return d_demangle_callback (mangled,
5442 DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX,
5443 callback, opaque);
bc9bf259
DD
5444}
5445
0c4460bb 5446#endif /* IN_LIBGCC2 || IN_GLIBCPP_V3 */
03d5f569 5447
2a9dffbf 5448#ifndef IN_GLIBCPP_V3
d00edca5
DD
5449
5450/* Demangle a string in order to find out whether it is a constructor
5451 or destructor. Return non-zero on success. Set *CTOR_KIND and
5452 *DTOR_KIND appropriately. */
5453
5454static int
9334f9c6
DD
5455is_ctor_or_dtor (const char *mangled,
5456 enum gnu_v3_ctor_kinds *ctor_kind,
5457 enum gnu_v3_dtor_kinds *dtor_kind)
e61231f1 5458{
d00edca5 5459 struct d_info di;
59727473 5460 struct demangle_component *dc;
858b45cf 5461 int ret;
e61231f1 5462
d00edca5
DD
5463 *ctor_kind = (enum gnu_v3_ctor_kinds) 0;
5464 *dtor_kind = (enum gnu_v3_dtor_kinds) 0;
5465
59727473 5466 cplus_demangle_init_info (mangled, DMGL_GNU_V3, strlen (mangled), &di);
e61231f1 5467
b6fb00c0
DD
5468 {
5469#ifdef CP_DYNAMIC_ARRAYS
59727473
DD
5470 __extension__ struct demangle_component comps[di.num_comps];
5471 __extension__ struct demangle_component *subs[di.num_subs];
b6fb00c0 5472
208c1674
DD
5473 di.comps = comps;
5474 di.subs = subs;
b6fb00c0 5475#else
208c1674
DD
5476 di.comps = alloca (di.num_comps * sizeof (*di.comps));
5477 di.subs = alloca (di.num_subs * sizeof (*di.subs));
b6fb00c0 5478#endif
d00edca5 5479
59727473 5480 dc = cplus_demangle_mangled_name (&di, 1);
d35d0cd4 5481
b6fb00c0
DD
5482 /* Note that because we did not pass DMGL_PARAMS, we don't expect
5483 to demangle the entire string. */
e61231f1 5484
b6fb00c0
DD
5485 ret = 0;
5486 while (dc != NULL)
5487 {
5488 switch (dc->type)
5489 {
5490 default:
5491 dc = NULL;
5492 break;
59727473
DD
5493 case DEMANGLE_COMPONENT_TYPED_NAME:
5494 case DEMANGLE_COMPONENT_TEMPLATE:
5495 case DEMANGLE_COMPONENT_RESTRICT_THIS:
5496 case DEMANGLE_COMPONENT_VOLATILE_THIS:
5497 case DEMANGLE_COMPONENT_CONST_THIS:
b6fb00c0
DD
5498 dc = d_left (dc);
5499 break;
59727473
DD
5500 case DEMANGLE_COMPONENT_QUAL_NAME:
5501 case DEMANGLE_COMPONENT_LOCAL_NAME:
b6fb00c0
DD
5502 dc = d_right (dc);
5503 break;
59727473 5504 case DEMANGLE_COMPONENT_CTOR:
b6fb00c0
DD
5505 *ctor_kind = dc->u.s_ctor.kind;
5506 ret = 1;
5507 dc = NULL;
5508 break;
59727473 5509 case DEMANGLE_COMPONENT_DTOR:
b6fb00c0
DD
5510 *dtor_kind = dc->u.s_dtor.kind;
5511 ret = 1;
5512 dc = NULL;
5513 break;
5514 }
5515 }
b6fb00c0 5516 }
858b45cf
DD
5517
5518 return ret;
e61231f1
JB
5519}
5520
d00edca5
DD
5521/* Return whether NAME is the mangled form of a g++ V3 ABI constructor
5522 name. A non-zero return indicates the type of constructor. */
e61231f1 5523
e61231f1 5524enum gnu_v3_ctor_kinds
9334f9c6 5525is_gnu_v3_mangled_ctor (const char *name)
e61231f1 5526{
d00edca5
DD
5527 enum gnu_v3_ctor_kinds ctor_kind;
5528 enum gnu_v3_dtor_kinds dtor_kind;
e61231f1 5529
d00edca5 5530 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
585cc78f 5531 return (enum gnu_v3_ctor_kinds) 0;
d00edca5 5532 return ctor_kind;
e61231f1
JB
5533}
5534
5535
d00edca5
DD
5536/* Return whether NAME is the mangled form of a g++ V3 ABI destructor
5537 name. A non-zero return indicates the type of destructor. */
5538
e61231f1 5539enum gnu_v3_dtor_kinds
9334f9c6 5540is_gnu_v3_mangled_dtor (const char *name)
e61231f1 5541{
d00edca5
DD
5542 enum gnu_v3_ctor_kinds ctor_kind;
5543 enum gnu_v3_dtor_kinds dtor_kind;
e61231f1 5544
d00edca5 5545 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
585cc78f 5546 return (enum gnu_v3_dtor_kinds) 0;
d00edca5 5547 return dtor_kind;
e61231f1
JB
5548}
5549
d00edca5 5550#endif /* IN_GLIBCPP_V3 */
e61231f1 5551
eb383413
L
5552#ifdef STANDALONE_DEMANGLER
5553
5554#include "getopt.h"
d00edca5
DD
5555#include "dyn-string.h"
5556
e064c173 5557static void print_usage (FILE* fp, int exit_value);
eb383413 5558
d00edca5
DD
5559#define IS_ALPHA(CHAR) \
5560 (((CHAR) >= 'a' && (CHAR) <= 'z') \
5561 || ((CHAR) >= 'A' && (CHAR) <= 'Z'))
eb383413
L
5562
5563/* Non-zero if CHAR is a character than can occur in a mangled name. */
5564#define is_mangled_char(CHAR) \
74bcd529
DD
5565 (IS_ALPHA (CHAR) || IS_DIGIT (CHAR) \
5566 || (CHAR) == '_' || (CHAR) == '.' || (CHAR) == '$')
eb383413
L
5567
5568/* The name of this program, as invoked. */
5569const char* program_name;
5570
5571/* Prints usage summary to FP and then exits with EXIT_VALUE. */
5572
5573static void
9334f9c6 5574print_usage (FILE* fp, int exit_value)
eb383413
L
5575{
5576 fprintf (fp, "Usage: %s [options] [names ...]\n", program_name);
74bcd529 5577 fprintf (fp, "Options:\n");
eb383413 5578 fprintf (fp, " -h,--help Display this message.\n");
6d95373e 5579 fprintf (fp, " -p,--no-params Don't display function parameters\n");
eb383413
L
5580 fprintf (fp, " -v,--verbose Produce verbose demanglings.\n");
5581 fprintf (fp, "If names are provided, they are demangled. Otherwise filters standard input.\n");
5582
5583 exit (exit_value);
5584}
5585
5586/* Option specification for getopt_long. */
c23795e2 5587static const struct option long_options[] =
eb383413 5588{
6d95373e
DD
5589 { "help", no_argument, NULL, 'h' },
5590 { "no-params", no_argument, NULL, 'p' },
5591 { "verbose", no_argument, NULL, 'v' },
5592 { NULL, no_argument, NULL, 0 },
eb383413
L
5593};
5594
5595/* Main entry for a demangling filter executable. It will demangle
5596 its command line arguments, if any. If none are provided, it will
5597 filter stdin to stdout, replacing any recognized mangled C++ names
5598 with their demangled equivalents. */
5599
5600int
9334f9c6 5601main (int argc, char *argv[])
eb383413 5602{
eb383413
L
5603 int i;
5604 int opt_char;
d00edca5 5605 int options = DMGL_PARAMS | DMGL_ANSI | DMGL_TYPES;
eb383413
L
5606
5607 /* Use the program name of this program, as invoked. */
5608 program_name = argv[0];
5609
5610 /* Parse options. */
5611 do
5612 {
6d95373e 5613 opt_char = getopt_long (argc, argv, "hpv", long_options, NULL);
eb383413
L
5614 switch (opt_char)
5615 {
5616 case '?': /* Unrecognized option. */
5617 print_usage (stderr, 1);
5618 break;
5619
5620 case 'h':
5621 print_usage (stdout, 0);
5622 break;
5623
6d95373e
DD
5624 case 'p':
5625 options &= ~ DMGL_PARAMS;
5626 break;
5627
eb383413 5628 case 'v':
d00edca5 5629 options |= DMGL_VERBOSE;
eb383413
L
5630 break;
5631 }
5632 }
5633 while (opt_char != -1);
5634
5635 if (optind == argc)
5636 /* No command line arguments were provided. Filter stdin. */
5637 {
5638 dyn_string_t mangled = dyn_string_new (3);
d00edca5 5639 char *s;
eb383413
L
5640
5641 /* Read all of input. */
5642 while (!feof (stdin))
5643 {
d00edca5 5644 char c;
eb383413
L
5645
5646 /* Pile characters into mangled until we hit one that can't
5647 occur in a mangled name. */
5648 c = getchar ();
5649 while (!feof (stdin) && is_mangled_char (c))
5650 {
5651 dyn_string_append_char (mangled, c);
5652 if (feof (stdin))
5653 break;
5654 c = getchar ();
5655 }
5656
d00edca5 5657 if (dyn_string_length (mangled) > 0)
03d5f569 5658 {
74aee4eb
DD
5659#ifdef IN_GLIBCPP_V3
5660 s = __cxa_demangle (dyn_string_buf (mangled), NULL, NULL, NULL);
5661#else
d00edca5 5662 s = cplus_demangle_v3 (dyn_string_buf (mangled), options);
74aee4eb 5663#endif
d00edca5
DD
5664
5665 if (s != NULL)
5666 {
5667 fputs (s, stdout);
5668 free (s);
5669 }
5670 else
5671 {
5672 /* It might not have been a mangled name. Print the
5673 original text. */
5674 fputs (dyn_string_buf (mangled), stdout);
5675 }
5676
5677 dyn_string_clear (mangled);
03d5f569 5678 }
eb383413
L
5679
5680 /* If we haven't hit EOF yet, we've read one character that
5681 can't occur in a mangled name, so print it out. */
5682 if (!feof (stdin))
5683 putchar (c);
eb383413
L
5684 }
5685
5686 dyn_string_delete (mangled);
eb383413
L
5687 }
5688 else
5689 /* Demangle command line arguments. */
5690 {
eb383413
L
5691 /* Loop over command line arguments. */
5692 for (i = optind; i < argc; ++i)
5693 {
d00edca5 5694 char *s;
74aee4eb
DD
5695#ifdef IN_GLIBCPP_V3
5696 int status;
5697#endif
d00edca5 5698
eb383413 5699 /* Attempt to demangle. */
74aee4eb
DD
5700#ifdef IN_GLIBCPP_V3
5701 s = __cxa_demangle (argv[i], NULL, NULL, &status);
5702#else
d00edca5 5703 s = cplus_demangle_v3 (argv[i], options);
74aee4eb 5704#endif
eb383413
L
5705
5706 /* If it worked, print the demangled name. */
d00edca5 5707 if (s != NULL)
03d5f569 5708 {
d00edca5
DD
5709 printf ("%s\n", s);
5710 free (s);
03d5f569 5711 }
d00edca5 5712 else
74aee4eb
DD
5713 {
5714#ifdef IN_GLIBCPP_V3
5715 fprintf (stderr, "Failed: %s (status %d)\n", argv[i], status);
5716#else
5717 fprintf (stderr, "Failed: %s\n", argv[i]);
5718#endif
5719 }
eb383413 5720 }
eb383413
L
5721 }
5722
5723 return 0;
5724}
5725
5726#endif /* STANDALONE_DEMANGLER */