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