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