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