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