Sync libiberty sources with gcc mainline.
[deliverable/binutils-gdb.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
2172 switch (d_peek_next_char (di))
2173 {
2174 case '1':
2175 kind = gnu_v3_complete_object_ctor;
2176 break;
2177 case '2':
2178 kind = gnu_v3_base_object_ctor;
2179 break;
2180 case '3':
2181 kind = gnu_v3_complete_object_allocating_ctor;
2182 break;
2183 case '4':
2184 kind = gnu_v3_unified_ctor;
2185 break;
2186 case '5':
2187 kind = gnu_v3_object_ctor_group;
2188 break;
2189 default:
2190 return NULL;
2191 }
2192 d_advance (di, 2);
2193 return d_make_ctor (di, kind, di->last_name);
2194 }
2195
2196 case 'D':
2197 {
2198 enum gnu_v3_dtor_kinds kind;
2199
2200 switch (d_peek_next_char (di))
2201 {
2202 case '0':
2203 kind = gnu_v3_deleting_dtor;
2204 break;
2205 case '1':
2206 kind = gnu_v3_complete_object_dtor;
2207 break;
2208 case '2':
2209 kind = gnu_v3_base_object_dtor;
2210 break;
2211 /* digit '3' is not used */
2212 case '4':
2213 kind = gnu_v3_unified_dtor;
2214 break;
2215 case '5':
2216 kind = gnu_v3_object_dtor_group;
2217 break;
2218 default:
2219 return NULL;
2220 }
2221 d_advance (di, 2);
2222 return d_make_dtor (di, kind, di->last_name);
2223 }
2224
2225 default:
2226 return NULL;
2227 }
2228 }
2229
2230 /* <type> ::= <builtin-type>
2231 ::= <function-type>
2232 ::= <class-enum-type>
2233 ::= <array-type>
2234 ::= <pointer-to-member-type>
2235 ::= <template-param>
2236 ::= <template-template-param> <template-args>
2237 ::= <substitution>
2238 ::= <CV-qualifiers> <type>
2239 ::= P <type>
2240 ::= R <type>
2241 ::= O <type> (C++0x)
2242 ::= C <type>
2243 ::= G <type>
2244 ::= U <source-name> <type>
2245
2246 <builtin-type> ::= various one letter codes
2247 ::= u <source-name>
2248 */
2249
2250 CP_STATIC_IF_GLIBCPP_V3
2251 const struct demangle_builtin_type_info
2252 cplus_demangle_builtin_types[D_BUILTIN_TYPE_COUNT] =
2253 {
2254 /* a */ { NL ("signed char"), NL ("signed char"), D_PRINT_DEFAULT },
2255 /* b */ { NL ("bool"), NL ("boolean"), D_PRINT_BOOL },
2256 /* c */ { NL ("char"), NL ("byte"), D_PRINT_DEFAULT },
2257 /* d */ { NL ("double"), NL ("double"), D_PRINT_FLOAT },
2258 /* e */ { NL ("long double"), NL ("long double"), D_PRINT_FLOAT },
2259 /* f */ { NL ("float"), NL ("float"), D_PRINT_FLOAT },
2260 /* g */ { NL ("__float128"), NL ("__float128"), D_PRINT_FLOAT },
2261 /* h */ { NL ("unsigned char"), NL ("unsigned char"), D_PRINT_DEFAULT },
2262 /* i */ { NL ("int"), NL ("int"), D_PRINT_INT },
2263 /* j */ { NL ("unsigned int"), NL ("unsigned"), D_PRINT_UNSIGNED },
2264 /* k */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2265 /* l */ { NL ("long"), NL ("long"), D_PRINT_LONG },
2266 /* m */ { NL ("unsigned long"), NL ("unsigned long"), D_PRINT_UNSIGNED_LONG },
2267 /* n */ { NL ("__int128"), NL ("__int128"), D_PRINT_DEFAULT },
2268 /* o */ { NL ("unsigned __int128"), NL ("unsigned __int128"),
2269 D_PRINT_DEFAULT },
2270 /* p */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2271 /* q */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2272 /* r */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2273 /* s */ { NL ("short"), NL ("short"), D_PRINT_DEFAULT },
2274 /* t */ { NL ("unsigned short"), NL ("unsigned short"), D_PRINT_DEFAULT },
2275 /* u */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2276 /* v */ { NL ("void"), NL ("void"), D_PRINT_VOID },
2277 /* w */ { NL ("wchar_t"), NL ("char"), D_PRINT_DEFAULT },
2278 /* x */ { NL ("long long"), NL ("long"), D_PRINT_LONG_LONG },
2279 /* y */ { NL ("unsigned long long"), NL ("unsigned long long"),
2280 D_PRINT_UNSIGNED_LONG_LONG },
2281 /* z */ { NL ("..."), NL ("..."), D_PRINT_DEFAULT },
2282 /* 26 */ { NL ("decimal32"), NL ("decimal32"), D_PRINT_DEFAULT },
2283 /* 27 */ { NL ("decimal64"), NL ("decimal64"), D_PRINT_DEFAULT },
2284 /* 28 */ { NL ("decimal128"), NL ("decimal128"), D_PRINT_DEFAULT },
2285 /* 29 */ { NL ("half"), NL ("half"), D_PRINT_FLOAT },
2286 /* 30 */ { NL ("char16_t"), NL ("char16_t"), D_PRINT_DEFAULT },
2287 /* 31 */ { NL ("char32_t"), NL ("char32_t"), D_PRINT_DEFAULT },
2288 /* 32 */ { NL ("decltype(nullptr)"), NL ("decltype(nullptr)"),
2289 D_PRINT_DEFAULT },
2290 };
2291
2292 CP_STATIC_IF_GLIBCPP_V3
2293 struct demangle_component *
2294 cplus_demangle_type (struct d_info *di)
2295 {
2296 char peek;
2297 struct demangle_component *ret;
2298 int can_subst;
2299
2300 /* The ABI specifies that when CV-qualifiers are used, the base type
2301 is substitutable, and the fully qualified type is substitutable,
2302 but the base type with a strict subset of the CV-qualifiers is
2303 not substitutable. The natural recursive implementation of the
2304 CV-qualifiers would cause subsets to be substitutable, so instead
2305 we pull them all off now.
2306
2307 FIXME: The ABI says that order-insensitive vendor qualifiers
2308 should be handled in the same way, but we have no way to tell
2309 which vendor qualifiers are order-insensitive and which are
2310 order-sensitive. So we just assume that they are all
2311 order-sensitive. g++ 3.4 supports only one vendor qualifier,
2312 __vector, and it treats it as order-sensitive when mangling
2313 names. */
2314
2315 peek = d_peek_char (di);
2316 if (peek == 'r' || peek == 'V' || peek == 'K'
2317 || (peek == 'D' && d_peek_next_char (di) == 'x'))
2318 {
2319 struct demangle_component **pret;
2320
2321 pret = d_cv_qualifiers (di, &ret, 0);
2322 if (pret == NULL)
2323 return NULL;
2324 if (d_peek_char (di) == 'F')
2325 {
2326 /* cv-qualifiers before a function type apply to 'this',
2327 so avoid adding the unqualified function type to
2328 the substitution list. */
2329 *pret = d_function_type (di);
2330 }
2331 else
2332 *pret = cplus_demangle_type (di);
2333 if (!*pret)
2334 return NULL;
2335 if ((*pret)->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
2336 || (*pret)->type == DEMANGLE_COMPONENT_REFERENCE_THIS)
2337 {
2338 /* Move the ref-qualifier outside the cv-qualifiers so that
2339 they are printed in the right order. */
2340 struct demangle_component *fn = d_left (*pret);
2341 d_left (*pret) = ret;
2342 ret = *pret;
2343 *pret = fn;
2344 }
2345 if (! d_add_substitution (di, ret))
2346 return NULL;
2347 return ret;
2348 }
2349
2350 can_subst = 1;
2351
2352 switch (peek)
2353 {
2354 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
2355 case 'h': case 'i': case 'j': case 'l': case 'm': case 'n':
2356 case 'o': case 's': case 't':
2357 case 'v': case 'w': case 'x': case 'y': case 'z':
2358 ret = d_make_builtin_type (di,
2359 &cplus_demangle_builtin_types[peek - 'a']);
2360 di->expansion += ret->u.s_builtin.type->len;
2361 can_subst = 0;
2362 d_advance (di, 1);
2363 break;
2364
2365 case 'u':
2366 d_advance (di, 1);
2367 ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE,
2368 d_source_name (di), NULL);
2369 break;
2370
2371 case 'F':
2372 ret = d_function_type (di);
2373 break;
2374
2375 case '0': case '1': case '2': case '3': case '4':
2376 case '5': case '6': case '7': case '8': case '9':
2377 case 'N':
2378 case 'Z':
2379 ret = d_class_enum_type (di);
2380 break;
2381
2382 case 'A':
2383 ret = d_array_type (di);
2384 break;
2385
2386 case 'M':
2387 ret = d_pointer_to_member_type (di);
2388 break;
2389
2390 case 'T':
2391 ret = d_template_param (di);
2392 if (d_peek_char (di) == 'I')
2393 {
2394 /* This may be <template-template-param> <template-args>.
2395 If this is the type for a conversion operator, we can
2396 have a <template-template-param> here only by following
2397 a derivation like this:
2398
2399 <nested-name>
2400 -> <template-prefix> <template-args>
2401 -> <prefix> <template-unqualified-name> <template-args>
2402 -> <unqualified-name> <template-unqualified-name> <template-args>
2403 -> <source-name> <template-unqualified-name> <template-args>
2404 -> <source-name> <operator-name> <template-args>
2405 -> <source-name> cv <type> <template-args>
2406 -> <source-name> cv <template-template-param> <template-args> <template-args>
2407
2408 where the <template-args> is followed by another.
2409 Otherwise, we must have 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-param> <template-args>
2419
2420 where we need to leave the <template-args> to be processed
2421 by d_prefix (following the <template-prefix>).
2422
2423 The <template-template-param> part is a substitution
2424 candidate. */
2425 if (! di->is_conversion)
2426 {
2427 if (! d_add_substitution (di, ret))
2428 return NULL;
2429 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2430 d_template_args (di));
2431 }
2432 else
2433 {
2434 struct demangle_component *args;
2435 struct d_info_checkpoint checkpoint;
2436
2437 d_checkpoint (di, &checkpoint);
2438 args = d_template_args (di);
2439 if (d_peek_char (di) == 'I')
2440 {
2441 if (! d_add_substitution (di, ret))
2442 return NULL;
2443 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2444 args);
2445 }
2446 else
2447 d_backtrack (di, &checkpoint);
2448 }
2449 }
2450 break;
2451
2452 case 'S':
2453 /* If this is a special substitution, then it is the start of
2454 <class-enum-type>. */
2455 {
2456 char peek_next;
2457
2458 peek_next = d_peek_next_char (di);
2459 if (IS_DIGIT (peek_next)
2460 || peek_next == '_'
2461 || IS_UPPER (peek_next))
2462 {
2463 ret = d_substitution (di, 0);
2464 /* The substituted name may have been a template name and
2465 may be followed by tepmlate args. */
2466 if (d_peek_char (di) == 'I')
2467 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2468 d_template_args (di));
2469 else
2470 can_subst = 0;
2471 }
2472 else
2473 {
2474 ret = d_class_enum_type (di);
2475 /* If the substitution was a complete type, then it is not
2476 a new substitution candidate. However, if the
2477 substitution was followed by template arguments, then
2478 the whole thing is a substitution candidate. */
2479 if (ret != NULL && ret->type == DEMANGLE_COMPONENT_SUB_STD)
2480 can_subst = 0;
2481 }
2482 }
2483 break;
2484
2485 case 'O':
2486 d_advance (di, 1);
2487 ret = d_make_comp (di, DEMANGLE_COMPONENT_RVALUE_REFERENCE,
2488 cplus_demangle_type (di), NULL);
2489 break;
2490
2491 case 'P':
2492 d_advance (di, 1);
2493 ret = d_make_comp (di, DEMANGLE_COMPONENT_POINTER,
2494 cplus_demangle_type (di), NULL);
2495 break;
2496
2497 case 'R':
2498 d_advance (di, 1);
2499 ret = d_make_comp (di, DEMANGLE_COMPONENT_REFERENCE,
2500 cplus_demangle_type (di), NULL);
2501 break;
2502
2503 case 'C':
2504 d_advance (di, 1);
2505 ret = d_make_comp (di, DEMANGLE_COMPONENT_COMPLEX,
2506 cplus_demangle_type (di), NULL);
2507 break;
2508
2509 case 'G':
2510 d_advance (di, 1);
2511 ret = d_make_comp (di, DEMANGLE_COMPONENT_IMAGINARY,
2512 cplus_demangle_type (di), NULL);
2513 break;
2514
2515 case 'U':
2516 d_advance (di, 1);
2517 ret = d_source_name (di);
2518 if (d_peek_char (di) == 'I')
2519 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2520 d_template_args (di));
2521 ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL,
2522 cplus_demangle_type (di), ret);
2523 break;
2524
2525 case 'D':
2526 can_subst = 0;
2527 d_advance (di, 1);
2528 peek = d_next_char (di);
2529 switch (peek)
2530 {
2531 case 'T':
2532 case 't':
2533 /* decltype (expression) */
2534 ret = d_make_comp (di, DEMANGLE_COMPONENT_DECLTYPE,
2535 d_expression (di), NULL);
2536 if (ret && d_next_char (di) != 'E')
2537 ret = NULL;
2538 can_subst = 1;
2539 break;
2540
2541 case 'p':
2542 /* Pack expansion. */
2543 ret = d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION,
2544 cplus_demangle_type (di), NULL);
2545 can_subst = 1;
2546 break;
2547
2548 case 'a':
2549 /* auto */
2550 ret = d_make_name (di, "auto", 4);
2551 break;
2552
2553 case 'f':
2554 /* 32-bit decimal floating point */
2555 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[26]);
2556 di->expansion += ret->u.s_builtin.type->len;
2557 break;
2558 case 'd':
2559 /* 64-bit DFP */
2560 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[27]);
2561 di->expansion += ret->u.s_builtin.type->len;
2562 break;
2563 case 'e':
2564 /* 128-bit DFP */
2565 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[28]);
2566 di->expansion += ret->u.s_builtin.type->len;
2567 break;
2568 case 'h':
2569 /* 16-bit half-precision FP */
2570 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[29]);
2571 di->expansion += ret->u.s_builtin.type->len;
2572 break;
2573 case 's':
2574 /* char16_t */
2575 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[30]);
2576 di->expansion += ret->u.s_builtin.type->len;
2577 break;
2578 case 'i':
2579 /* char32_t */
2580 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[31]);
2581 di->expansion += ret->u.s_builtin.type->len;
2582 break;
2583
2584 case 'F':
2585 /* Fixed point types. DF<int bits><length><fract bits><sat> */
2586 ret = d_make_empty (di);
2587 ret->type = DEMANGLE_COMPONENT_FIXED_TYPE;
2588 if ((ret->u.s_fixed.accum = IS_DIGIT (d_peek_char (di))))
2589 /* For demangling we don't care about the bits. */
2590 d_number (di);
2591 ret->u.s_fixed.length = cplus_demangle_type (di);
2592 if (ret->u.s_fixed.length == NULL)
2593 return NULL;
2594 d_number (di);
2595 peek = d_next_char (di);
2596 ret->u.s_fixed.sat = (peek == 's');
2597 break;
2598
2599 case 'v':
2600 ret = d_vector_type (di);
2601 can_subst = 1;
2602 break;
2603
2604 case 'n':
2605 /* decltype(nullptr) */
2606 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[32]);
2607 di->expansion += ret->u.s_builtin.type->len;
2608 break;
2609
2610 default:
2611 return NULL;
2612 }
2613 break;
2614
2615 default:
2616 return NULL;
2617 }
2618
2619 if (can_subst)
2620 {
2621 if (! d_add_substitution (di, ret))
2622 return NULL;
2623 }
2624
2625 return ret;
2626 }
2627
2628 /* <CV-qualifiers> ::= [r] [V] [K] [Dx] */
2629
2630 static struct demangle_component **
2631 d_cv_qualifiers (struct d_info *di,
2632 struct demangle_component **pret, int member_fn)
2633 {
2634 struct demangle_component **pstart;
2635 char peek;
2636
2637 pstart = pret;
2638 peek = d_peek_char (di);
2639 while (peek == 'r' || peek == 'V' || peek == 'K'
2640 || (peek == 'D' && d_peek_next_char (di) == 'x'))
2641 {
2642 enum demangle_component_type t;
2643
2644 d_advance (di, 1);
2645 if (peek == 'r')
2646 {
2647 t = (member_fn
2648 ? DEMANGLE_COMPONENT_RESTRICT_THIS
2649 : DEMANGLE_COMPONENT_RESTRICT);
2650 di->expansion += sizeof "restrict";
2651 }
2652 else if (peek == 'V')
2653 {
2654 t = (member_fn
2655 ? DEMANGLE_COMPONENT_VOLATILE_THIS
2656 : DEMANGLE_COMPONENT_VOLATILE);
2657 di->expansion += sizeof "volatile";
2658 }
2659 else if (peek == 'K')
2660 {
2661 t = (member_fn
2662 ? DEMANGLE_COMPONENT_CONST_THIS
2663 : DEMANGLE_COMPONENT_CONST);
2664 di->expansion += sizeof "const";
2665 }
2666 else
2667 {
2668 t = DEMANGLE_COMPONENT_TRANSACTION_SAFE;
2669 di->expansion += sizeof "transaction_safe";
2670 d_advance (di, 1);
2671 }
2672
2673 *pret = d_make_comp (di, t, NULL, NULL);
2674 if (*pret == NULL)
2675 return NULL;
2676 pret = &d_left (*pret);
2677
2678 peek = d_peek_char (di);
2679 }
2680
2681 if (!member_fn && peek == 'F')
2682 {
2683 while (pstart != pret)
2684 {
2685 switch ((*pstart)->type)
2686 {
2687 case DEMANGLE_COMPONENT_RESTRICT:
2688 (*pstart)->type = DEMANGLE_COMPONENT_RESTRICT_THIS;
2689 break;
2690 case DEMANGLE_COMPONENT_VOLATILE:
2691 (*pstart)->type = DEMANGLE_COMPONENT_VOLATILE_THIS;
2692 break;
2693 case DEMANGLE_COMPONENT_CONST:
2694 (*pstart)->type = DEMANGLE_COMPONENT_CONST_THIS;
2695 break;
2696 default:
2697 break;
2698 }
2699 pstart = &d_left (*pstart);
2700 }
2701 }
2702
2703 return pret;
2704 }
2705
2706 /* <ref-qualifier> ::= R
2707 ::= O */
2708
2709 static struct demangle_component *
2710 d_ref_qualifier (struct d_info *di, struct demangle_component *sub)
2711 {
2712 struct demangle_component *ret = sub;
2713 char peek;
2714
2715 peek = d_peek_char (di);
2716 if (peek == 'R' || peek == 'O')
2717 {
2718 enum demangle_component_type t;
2719 if (peek == 'R')
2720 {
2721 t = DEMANGLE_COMPONENT_REFERENCE_THIS;
2722 di->expansion += sizeof "&";
2723 }
2724 else
2725 {
2726 t = DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS;
2727 di->expansion += sizeof "&&";
2728 }
2729 d_advance (di, 1);
2730
2731 ret = d_make_comp (di, t, ret, NULL);
2732 }
2733
2734 return ret;
2735 }
2736
2737 /* <function-type> ::= F [Y] <bare-function-type> [<ref-qualifier>] [T] E */
2738
2739 static struct demangle_component *
2740 d_function_type (struct d_info *di)
2741 {
2742 struct demangle_component *ret;
2743
2744 if (! d_check_char (di, 'F'))
2745 return NULL;
2746 if (d_peek_char (di) == 'Y')
2747 {
2748 /* Function has C linkage. We don't print this information.
2749 FIXME: We should print it in verbose mode. */
2750 d_advance (di, 1);
2751 }
2752 ret = d_bare_function_type (di, 1);
2753 ret = d_ref_qualifier (di, ret);
2754
2755 if (! d_check_char (di, 'E'))
2756 return NULL;
2757 return ret;
2758 }
2759
2760 /* <type>+ */
2761
2762 static struct demangle_component *
2763 d_parmlist (struct d_info *di)
2764 {
2765 struct demangle_component *tl;
2766 struct demangle_component **ptl;
2767
2768 tl = NULL;
2769 ptl = &tl;
2770 while (1)
2771 {
2772 struct demangle_component *type;
2773
2774 char peek = d_peek_char (di);
2775 if (peek == '\0' || peek == 'E' || peek == '.')
2776 break;
2777 if ((peek == 'R' || peek == 'O')
2778 && d_peek_next_char (di) == 'E')
2779 /* Function ref-qualifier, not a ref prefix for a parameter type. */
2780 break;
2781 type = cplus_demangle_type (di);
2782 if (type == NULL)
2783 return NULL;
2784 *ptl = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, type, NULL);
2785 if (*ptl == NULL)
2786 return NULL;
2787 ptl = &d_right (*ptl);
2788 }
2789
2790 /* There should be at least one parameter type besides the optional
2791 return type. A function which takes no arguments will have a
2792 single parameter type void. */
2793 if (tl == NULL)
2794 return NULL;
2795
2796 /* If we have a single parameter type void, omit it. */
2797 if (d_right (tl) == NULL
2798 && d_left (tl)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
2799 && d_left (tl)->u.s_builtin.type->print == D_PRINT_VOID)
2800 {
2801 di->expansion -= d_left (tl)->u.s_builtin.type->len;
2802 d_left (tl) = NULL;
2803 }
2804
2805 return tl;
2806 }
2807
2808 /* <bare-function-type> ::= [J]<type>+ */
2809
2810 static struct demangle_component *
2811 d_bare_function_type (struct d_info *di, int has_return_type)
2812 {
2813 struct demangle_component *return_type;
2814 struct demangle_component *tl;
2815 char peek;
2816
2817 /* Detect special qualifier indicating that the first argument
2818 is the return type. */
2819 peek = d_peek_char (di);
2820 if (peek == 'J')
2821 {
2822 d_advance (di, 1);
2823 has_return_type = 1;
2824 }
2825
2826 if (has_return_type)
2827 {
2828 return_type = cplus_demangle_type (di);
2829 if (return_type == NULL)
2830 return NULL;
2831 }
2832 else
2833 return_type = NULL;
2834
2835 tl = d_parmlist (di);
2836 if (tl == NULL)
2837 return NULL;
2838
2839 return d_make_comp (di, DEMANGLE_COMPONENT_FUNCTION_TYPE,
2840 return_type, tl);
2841 }
2842
2843 /* <class-enum-type> ::= <name> */
2844
2845 static struct demangle_component *
2846 d_class_enum_type (struct d_info *di)
2847 {
2848 return d_name (di);
2849 }
2850
2851 /* <array-type> ::= A <(positive dimension) number> _ <(element) type>
2852 ::= A [<(dimension) expression>] _ <(element) type>
2853 */
2854
2855 static struct demangle_component *
2856 d_array_type (struct d_info *di)
2857 {
2858 char peek;
2859 struct demangle_component *dim;
2860
2861 if (! d_check_char (di, 'A'))
2862 return NULL;
2863
2864 peek = d_peek_char (di);
2865 if (peek == '_')
2866 dim = NULL;
2867 else if (IS_DIGIT (peek))
2868 {
2869 const char *s;
2870
2871 s = d_str (di);
2872 do
2873 {
2874 d_advance (di, 1);
2875 peek = d_peek_char (di);
2876 }
2877 while (IS_DIGIT (peek));
2878 dim = d_make_name (di, s, d_str (di) - s);
2879 if (dim == NULL)
2880 return NULL;
2881 }
2882 else
2883 {
2884 dim = d_expression (di);
2885 if (dim == NULL)
2886 return NULL;
2887 }
2888
2889 if (! d_check_char (di, '_'))
2890 return NULL;
2891
2892 return d_make_comp (di, DEMANGLE_COMPONENT_ARRAY_TYPE, dim,
2893 cplus_demangle_type (di));
2894 }
2895
2896 /* <vector-type> ::= Dv <number> _ <type>
2897 ::= Dv _ <expression> _ <type> */
2898
2899 static struct demangle_component *
2900 d_vector_type (struct d_info *di)
2901 {
2902 char peek;
2903 struct demangle_component *dim;
2904
2905 peek = d_peek_char (di);
2906 if (peek == '_')
2907 {
2908 d_advance (di, 1);
2909 dim = d_expression (di);
2910 }
2911 else
2912 dim = d_number_component (di);
2913
2914 if (dim == NULL)
2915 return NULL;
2916
2917 if (! d_check_char (di, '_'))
2918 return NULL;
2919
2920 return d_make_comp (di, DEMANGLE_COMPONENT_VECTOR_TYPE, dim,
2921 cplus_demangle_type (di));
2922 }
2923
2924 /* <pointer-to-member-type> ::= M <(class) type> <(member) type> */
2925
2926 static struct demangle_component *
2927 d_pointer_to_member_type (struct d_info *di)
2928 {
2929 struct demangle_component *cl;
2930 struct demangle_component *mem;
2931
2932 if (! d_check_char (di, 'M'))
2933 return NULL;
2934
2935 cl = cplus_demangle_type (di);
2936 if (cl == NULL)
2937 return NULL;
2938
2939 /* The ABI says, "The type of a non-static member function is considered
2940 to be different, for the purposes of substitution, from the type of a
2941 namespace-scope or static member function whose type appears
2942 similar. The types of two non-static member functions are considered
2943 to be different, for the purposes of substitution, if the functions
2944 are members of different classes. In other words, for the purposes of
2945 substitution, the class of which the function is a member is
2946 considered part of the type of function."
2947
2948 For a pointer to member function, this call to cplus_demangle_type
2949 will end up adding a (possibly qualified) non-member function type to
2950 the substitution table, which is not correct; however, the member
2951 function type will never be used in a substitution, so putting the
2952 wrong type in the substitution table is harmless. */
2953
2954 mem = cplus_demangle_type (di);
2955 if (mem == NULL)
2956 return NULL;
2957
2958 return d_make_comp (di, DEMANGLE_COMPONENT_PTRMEM_TYPE, cl, mem);
2959 }
2960
2961 /* <non-negative number> _ */
2962
2963 static int
2964 d_compact_number (struct d_info *di)
2965 {
2966 int num;
2967 if (d_peek_char (di) == '_')
2968 num = 0;
2969 else if (d_peek_char (di) == 'n')
2970 return -1;
2971 else
2972 num = d_number (di) + 1;
2973
2974 if (num < 0 || ! d_check_char (di, '_'))
2975 return -1;
2976 return num;
2977 }
2978
2979 /* <template-param> ::= T_
2980 ::= T <(parameter-2 non-negative) number> _
2981 */
2982
2983 static struct demangle_component *
2984 d_template_param (struct d_info *di)
2985 {
2986 int param;
2987
2988 if (! d_check_char (di, 'T'))
2989 return NULL;
2990
2991 param = d_compact_number (di);
2992 if (param < 0)
2993 return NULL;
2994
2995 ++di->did_subs;
2996
2997 return d_make_template_param (di, param);
2998 }
2999
3000 /* <template-args> ::= I <template-arg>+ E */
3001
3002 static struct demangle_component *
3003 d_template_args (struct d_info *di)
3004 {
3005 if (d_peek_char (di) != 'I'
3006 && d_peek_char (di) != 'J')
3007 return NULL;
3008 d_advance (di, 1);
3009
3010 return d_template_args_1 (di);
3011 }
3012
3013 /* <template-arg>* E */
3014
3015 static struct demangle_component *
3016 d_template_args_1 (struct d_info *di)
3017 {
3018 struct demangle_component *hold_last_name;
3019 struct demangle_component *al;
3020 struct demangle_component **pal;
3021
3022 /* Preserve the last name we saw--don't let the template arguments
3023 clobber it, as that would give us the wrong name for a subsequent
3024 constructor or destructor. */
3025 hold_last_name = di->last_name;
3026
3027 if (d_peek_char (di) == 'E')
3028 {
3029 /* An argument pack can be empty. */
3030 d_advance (di, 1);
3031 return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, NULL, NULL);
3032 }
3033
3034 al = NULL;
3035 pal = &al;
3036 while (1)
3037 {
3038 struct demangle_component *a;
3039
3040 a = d_template_arg (di);
3041 if (a == NULL)
3042 return NULL;
3043
3044 *pal = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, a, NULL);
3045 if (*pal == NULL)
3046 return NULL;
3047 pal = &d_right (*pal);
3048
3049 if (d_peek_char (di) == 'E')
3050 {
3051 d_advance (di, 1);
3052 break;
3053 }
3054 }
3055
3056 di->last_name = hold_last_name;
3057
3058 return al;
3059 }
3060
3061 /* <template-arg> ::= <type>
3062 ::= X <expression> E
3063 ::= <expr-primary>
3064 */
3065
3066 static struct demangle_component *
3067 d_template_arg (struct d_info *di)
3068 {
3069 struct demangle_component *ret;
3070
3071 switch (d_peek_char (di))
3072 {
3073 case 'X':
3074 d_advance (di, 1);
3075 ret = d_expression (di);
3076 if (! d_check_char (di, 'E'))
3077 return NULL;
3078 return ret;
3079
3080 case 'L':
3081 return d_expr_primary (di);
3082
3083 case 'I':
3084 case 'J':
3085 /* An argument pack. */
3086 return d_template_args (di);
3087
3088 default:
3089 return cplus_demangle_type (di);
3090 }
3091 }
3092
3093 /* Parse a sequence of expressions until we hit the terminator
3094 character. */
3095
3096 static struct demangle_component *
3097 d_exprlist (struct d_info *di, char terminator)
3098 {
3099 struct demangle_component *list = NULL;
3100 struct demangle_component **p = &list;
3101
3102 if (d_peek_char (di) == terminator)
3103 {
3104 d_advance (di, 1);
3105 return d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, NULL, NULL);
3106 }
3107
3108 while (1)
3109 {
3110 struct demangle_component *arg = d_expression (di);
3111 if (arg == NULL)
3112 return NULL;
3113
3114 *p = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, arg, NULL);
3115 if (*p == NULL)
3116 return NULL;
3117 p = &d_right (*p);
3118
3119 if (d_peek_char (di) == terminator)
3120 {
3121 d_advance (di, 1);
3122 break;
3123 }
3124 }
3125
3126 return list;
3127 }
3128
3129 /* Returns nonzero iff OP is an operator for a C++ cast: const_cast,
3130 dynamic_cast, static_cast or reinterpret_cast. */
3131
3132 static int
3133 op_is_new_cast (struct demangle_component *op)
3134 {
3135 const char *code = op->u.s_operator.op->code;
3136 return (code[1] == 'c'
3137 && (code[0] == 's' || code[0] == 'd'
3138 || code[0] == 'c' || code[0] == 'r'));
3139 }
3140
3141 /* <expression> ::= <(unary) operator-name> <expression>
3142 ::= <(binary) operator-name> <expression> <expression>
3143 ::= <(trinary) operator-name> <expression> <expression> <expression>
3144 ::= cl <expression>+ E
3145 ::= st <type>
3146 ::= <template-param>
3147 ::= sr <type> <unqualified-name>
3148 ::= sr <type> <unqualified-name> <template-args>
3149 ::= <expr-primary>
3150 */
3151
3152 static inline struct demangle_component *
3153 d_expression_1 (struct d_info *di)
3154 {
3155 char peek;
3156
3157 peek = d_peek_char (di);
3158 if (peek == 'L')
3159 return d_expr_primary (di);
3160 else if (peek == 'T')
3161 return d_template_param (di);
3162 else if (peek == 's' && d_peek_next_char (di) == 'r')
3163 {
3164 struct demangle_component *type;
3165 struct demangle_component *name;
3166
3167 d_advance (di, 2);
3168 type = cplus_demangle_type (di);
3169 name = d_unqualified_name (di);
3170 if (d_peek_char (di) != 'I')
3171 return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type, name);
3172 else
3173 return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type,
3174 d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
3175 d_template_args (di)));
3176 }
3177 else if (peek == 's' && d_peek_next_char (di) == 'p')
3178 {
3179 d_advance (di, 2);
3180 return d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION,
3181 d_expression_1 (di), NULL);
3182 }
3183 else if (peek == 'f' && d_peek_next_char (di) == 'p')
3184 {
3185 /* Function parameter used in a late-specified return type. */
3186 int index;
3187 d_advance (di, 2);
3188 if (d_peek_char (di) == 'T')
3189 {
3190 /* 'this' parameter. */
3191 d_advance (di, 1);
3192 index = 0;
3193 }
3194 else
3195 {
3196 index = d_compact_number (di);
3197 if (index == INT_MAX || index == -1)
3198 return NULL;
3199 index++;
3200 }
3201 return d_make_function_param (di, index);
3202 }
3203 else if (IS_DIGIT (peek)
3204 || (peek == 'o' && d_peek_next_char (di) == 'n'))
3205 {
3206 /* We can get an unqualified name as an expression in the case of
3207 a dependent function call, i.e. decltype(f(t)). */
3208 struct demangle_component *name;
3209
3210 if (peek == 'o')
3211 /* operator-function-id, i.e. operator+(t). */
3212 d_advance (di, 2);
3213
3214 name = d_unqualified_name (di);
3215 if (name == NULL)
3216 return NULL;
3217 if (d_peek_char (di) == 'I')
3218 return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
3219 d_template_args (di));
3220 else
3221 return name;
3222 }
3223 else if ((peek == 'i' || peek == 't')
3224 && d_peek_next_char (di) == 'l')
3225 {
3226 /* Brace-enclosed initializer list, untyped or typed. */
3227 struct demangle_component *type = NULL;
3228 if (peek == 't')
3229 type = cplus_demangle_type (di);
3230 if (!d_peek_next_char (di))
3231 return NULL;
3232 d_advance (di, 2);
3233 return d_make_comp (di, DEMANGLE_COMPONENT_INITIALIZER_LIST,
3234 type, d_exprlist (di, 'E'));
3235 }
3236 else
3237 {
3238 struct demangle_component *op;
3239 const char *code = NULL;
3240 int args;
3241
3242 op = d_operator_name (di);
3243 if (op == NULL)
3244 return NULL;
3245
3246 if (op->type == DEMANGLE_COMPONENT_OPERATOR)
3247 {
3248 code = op->u.s_operator.op->code;
3249 di->expansion += op->u.s_operator.op->len - 2;
3250 if (strcmp (code, "st") == 0)
3251 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
3252 cplus_demangle_type (di));
3253 }
3254
3255 switch (op->type)
3256 {
3257 default:
3258 return NULL;
3259 case DEMANGLE_COMPONENT_OPERATOR:
3260 args = op->u.s_operator.op->args;
3261 break;
3262 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
3263 args = op->u.s_extended_operator.args;
3264 break;
3265 case DEMANGLE_COMPONENT_CAST:
3266 args = 1;
3267 break;
3268 }
3269
3270 switch (args)
3271 {
3272 case 0:
3273 return d_make_comp (di, DEMANGLE_COMPONENT_NULLARY, op, NULL);
3274
3275 case 1:
3276 {
3277 struct demangle_component *operand;
3278 int suffix = 0;
3279
3280 if (code && (code[0] == 'p' || code[0] == 'm')
3281 && code[1] == code[0])
3282 /* pp_ and mm_ are the prefix variants. */
3283 suffix = !d_check_char (di, '_');
3284
3285 if (op->type == DEMANGLE_COMPONENT_CAST
3286 && d_check_char (di, '_'))
3287 operand = d_exprlist (di, 'E');
3288 else if (code && !strcmp (code, "sP"))
3289 operand = d_template_args_1 (di);
3290 else
3291 operand = d_expression_1 (di);
3292
3293 if (suffix)
3294 /* Indicate the suffix variant for d_print_comp. */
3295 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
3296 d_make_comp (di,
3297 DEMANGLE_COMPONENT_BINARY_ARGS,
3298 operand, operand));
3299 else
3300 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
3301 operand);
3302 }
3303 case 2:
3304 {
3305 struct demangle_component *left;
3306 struct demangle_component *right;
3307
3308 if (code == NULL)
3309 return NULL;
3310 if (op_is_new_cast (op))
3311 left = cplus_demangle_type (di);
3312 else if (code[0] == 'f')
3313 /* fold-expression. */
3314 left = d_operator_name (di);
3315 else
3316 left = d_expression_1 (di);
3317 if (!strcmp (code, "cl"))
3318 right = d_exprlist (di, 'E');
3319 else if (!strcmp (code, "dt") || !strcmp (code, "pt"))
3320 {
3321 right = d_unqualified_name (di);
3322 if (d_peek_char (di) == 'I')
3323 right = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE,
3324 right, d_template_args (di));
3325 }
3326 else
3327 right = d_expression_1 (di);
3328
3329 return d_make_comp (di, DEMANGLE_COMPONENT_BINARY, op,
3330 d_make_comp (di,
3331 DEMANGLE_COMPONENT_BINARY_ARGS,
3332 left, right));
3333 }
3334 case 3:
3335 {
3336 struct demangle_component *first;
3337 struct demangle_component *second;
3338 struct demangle_component *third;
3339
3340 if (code == NULL)
3341 return NULL;
3342 else if (!strcmp (code, "qu"))
3343 {
3344 /* ?: expression. */
3345 first = d_expression_1 (di);
3346 second = d_expression_1 (di);
3347 third = d_expression_1 (di);
3348 }
3349 else if (code[0] == 'f')
3350 {
3351 /* fold-expression. */
3352 first = d_operator_name (di);
3353 second = d_expression_1 (di);
3354 third = d_expression_1 (di);
3355 }
3356 else if (code[0] == 'n')
3357 {
3358 /* new-expression. */
3359 if (code[1] != 'w' && code[1] != 'a')
3360 return NULL;
3361 first = d_exprlist (di, '_');
3362 second = cplus_demangle_type (di);
3363 if (d_peek_char (di) == 'E')
3364 {
3365 d_advance (di, 1);
3366 third = NULL;
3367 }
3368 else if (d_peek_char (di) == 'p'
3369 && d_peek_next_char (di) == 'i')
3370 {
3371 /* Parenthesized initializer. */
3372 d_advance (di, 2);
3373 third = d_exprlist (di, 'E');
3374 }
3375 else if (d_peek_char (di) == 'i'
3376 && d_peek_next_char (di) == 'l')
3377 /* initializer-list. */
3378 third = d_expression_1 (di);
3379 else
3380 return NULL;
3381 }
3382 else
3383 return NULL;
3384 return d_make_comp (di, DEMANGLE_COMPONENT_TRINARY, op,
3385 d_make_comp (di,
3386 DEMANGLE_COMPONENT_TRINARY_ARG1,
3387 first,
3388 d_make_comp (di,
3389 DEMANGLE_COMPONENT_TRINARY_ARG2,
3390 second, third)));
3391 }
3392 default:
3393 return NULL;
3394 }
3395 }
3396 }
3397
3398 static struct demangle_component *
3399 d_expression (struct d_info *di)
3400 {
3401 struct demangle_component *ret;
3402 int was_expression = di->is_expression;
3403
3404 di->is_expression = 1;
3405 ret = d_expression_1 (di);
3406 di->is_expression = was_expression;
3407 return ret;
3408 }
3409
3410 /* <expr-primary> ::= L <type> <(value) number> E
3411 ::= L <type> <(value) float> E
3412 ::= L <mangled-name> E
3413 */
3414
3415 static struct demangle_component *
3416 d_expr_primary (struct d_info *di)
3417 {
3418 struct demangle_component *ret;
3419
3420 if (! d_check_char (di, 'L'))
3421 return NULL;
3422 if (d_peek_char (di) == '_'
3423 /* Workaround for G++ bug; see comment in write_template_arg. */
3424 || d_peek_char (di) == 'Z')
3425 ret = cplus_demangle_mangled_name (di, 0);
3426 else
3427 {
3428 struct demangle_component *type;
3429 enum demangle_component_type t;
3430 const char *s;
3431
3432 type = cplus_demangle_type (di);
3433 if (type == NULL)
3434 return NULL;
3435
3436 /* If we have a type we know how to print, we aren't going to
3437 print the type name itself. */
3438 if (type->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
3439 && type->u.s_builtin.type->print != D_PRINT_DEFAULT)
3440 di->expansion -= type->u.s_builtin.type->len;
3441
3442 /* Rather than try to interpret the literal value, we just
3443 collect it as a string. Note that it's possible to have a
3444 floating point literal here. The ABI specifies that the
3445 format of such literals is machine independent. That's fine,
3446 but what's not fine is that versions of g++ up to 3.2 with
3447 -fabi-version=1 used upper case letters in the hex constant,
3448 and dumped out gcc's internal representation. That makes it
3449 hard to tell where the constant ends, and hard to dump the
3450 constant in any readable form anyhow. We don't attempt to
3451 handle these cases. */
3452
3453 t = DEMANGLE_COMPONENT_LITERAL;
3454 if (d_peek_char (di) == 'n')
3455 {
3456 t = DEMANGLE_COMPONENT_LITERAL_NEG;
3457 d_advance (di, 1);
3458 }
3459 s = d_str (di);
3460 while (d_peek_char (di) != 'E')
3461 {
3462 if (d_peek_char (di) == '\0')
3463 return NULL;
3464 d_advance (di, 1);
3465 }
3466 ret = d_make_comp (di, t, type, d_make_name (di, s, d_str (di) - s));
3467 }
3468 if (! d_check_char (di, 'E'))
3469 return NULL;
3470 return ret;
3471 }
3472
3473 /* <local-name> ::= Z <(function) encoding> E <(entity) name> [<discriminator>]
3474 ::= Z <(function) encoding> E s [<discriminator>]
3475 ::= Z <(function) encoding> E d [<parameter> number>] _ <entity name>
3476 */
3477
3478 static struct demangle_component *
3479 d_local_name (struct d_info *di)
3480 {
3481 struct demangle_component *function;
3482
3483 if (! d_check_char (di, 'Z'))
3484 return NULL;
3485
3486 function = d_encoding (di, 0);
3487
3488 if (! d_check_char (di, 'E'))
3489 return NULL;
3490
3491 if (d_peek_char (di) == 's')
3492 {
3493 d_advance (di, 1);
3494 if (! d_discriminator (di))
3495 return NULL;
3496 return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function,
3497 d_make_name (di, "string literal",
3498 sizeof "string literal" - 1));
3499 }
3500 else
3501 {
3502 struct demangle_component *name;
3503 int num = -1;
3504
3505 if (d_peek_char (di) == 'd')
3506 {
3507 /* Default argument scope: d <number> _. */
3508 d_advance (di, 1);
3509 num = d_compact_number (di);
3510 if (num < 0)
3511 return NULL;
3512 }
3513
3514 name = d_name (di);
3515 if (name)
3516 switch (name->type)
3517 {
3518 /* Lambdas and unnamed types have internal discriminators. */
3519 case DEMANGLE_COMPONENT_LAMBDA:
3520 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
3521 break;
3522 default:
3523 if (! d_discriminator (di))
3524 return NULL;
3525 }
3526 if (num >= 0)
3527 name = d_make_default_arg (di, num, name);
3528 return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function, name);
3529 }
3530 }
3531
3532 /* <discriminator> ::= _ <(non-negative) number>
3533
3534 We demangle the discriminator, but we don't print it out. FIXME:
3535 We should print it out in verbose mode. */
3536
3537 static int
3538 d_discriminator (struct d_info *di)
3539 {
3540 int discrim;
3541
3542 if (d_peek_char (di) != '_')
3543 return 1;
3544 d_advance (di, 1);
3545 discrim = d_number (di);
3546 if (discrim < 0)
3547 return 0;
3548 return 1;
3549 }
3550
3551 /* <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _ */
3552
3553 static struct demangle_component *
3554 d_lambda (struct d_info *di)
3555 {
3556 struct demangle_component *tl;
3557 struct demangle_component *ret;
3558 int num;
3559
3560 if (! d_check_char (di, 'U'))
3561 return NULL;
3562 if (! d_check_char (di, 'l'))
3563 return NULL;
3564
3565 tl = d_parmlist (di);
3566 if (tl == NULL)
3567 return NULL;
3568
3569 if (! d_check_char (di, 'E'))
3570 return NULL;
3571
3572 num = d_compact_number (di);
3573 if (num < 0)
3574 return NULL;
3575
3576 ret = d_make_empty (di);
3577 if (ret)
3578 {
3579 ret->type = DEMANGLE_COMPONENT_LAMBDA;
3580 ret->u.s_unary_num.sub = tl;
3581 ret->u.s_unary_num.num = num;
3582 }
3583
3584 if (! d_add_substitution (di, ret))
3585 return NULL;
3586
3587 return ret;
3588 }
3589
3590 /* <unnamed-type-name> ::= Ut [ <nonnegative number> ] _ */
3591
3592 static struct demangle_component *
3593 d_unnamed_type (struct d_info *di)
3594 {
3595 struct demangle_component *ret;
3596 int num;
3597
3598 if (! d_check_char (di, 'U'))
3599 return NULL;
3600 if (! d_check_char (di, 't'))
3601 return NULL;
3602
3603 num = d_compact_number (di);
3604 if (num < 0)
3605 return NULL;
3606
3607 ret = d_make_empty (di);
3608 if (ret)
3609 {
3610 ret->type = DEMANGLE_COMPONENT_UNNAMED_TYPE;
3611 ret->u.s_number.number = num;
3612 }
3613
3614 if (! d_add_substitution (di, ret))
3615 return NULL;
3616
3617 return ret;
3618 }
3619
3620 /* <clone-suffix> ::= [ . <clone-type-identifier> ] [ . <nonnegative number> ]*
3621 */
3622
3623 static struct demangle_component *
3624 d_clone_suffix (struct d_info *di, struct demangle_component *encoding)
3625 {
3626 const char *suffix = d_str (di);
3627 const char *pend = suffix;
3628 struct demangle_component *n;
3629
3630 if (*pend == '.' && (IS_LOWER (pend[1]) || pend[1] == '_'))
3631 {
3632 pend += 2;
3633 while (IS_LOWER (*pend) || *pend == '_')
3634 ++pend;
3635 }
3636 while (*pend == '.' && IS_DIGIT (pend[1]))
3637 {
3638 pend += 2;
3639 while (IS_DIGIT (*pend))
3640 ++pend;
3641 }
3642 d_advance (di, pend - suffix);
3643 n = d_make_name (di, suffix, pend - suffix);
3644 return d_make_comp (di, DEMANGLE_COMPONENT_CLONE, encoding, n);
3645 }
3646
3647 /* Add a new substitution. */
3648
3649 static int
3650 d_add_substitution (struct d_info *di, struct demangle_component *dc)
3651 {
3652 if (dc == NULL)
3653 return 0;
3654 if (di->next_sub >= di->num_subs)
3655 return 0;
3656 di->subs[di->next_sub] = dc;
3657 ++di->next_sub;
3658 return 1;
3659 }
3660
3661 /* <substitution> ::= S <seq-id> _
3662 ::= S_
3663 ::= St
3664 ::= Sa
3665 ::= Sb
3666 ::= Ss
3667 ::= Si
3668 ::= So
3669 ::= Sd
3670
3671 If PREFIX is non-zero, then this type is being used as a prefix in
3672 a qualified name. In this case, for the standard substitutions, we
3673 need to check whether we are being used as a prefix for a
3674 constructor or destructor, and return a full template name.
3675 Otherwise we will get something like std::iostream::~iostream()
3676 which does not correspond particularly well to any function which
3677 actually appears in the source.
3678 */
3679
3680 static const struct d_standard_sub_info standard_subs[] =
3681 {
3682 { 't', NL ("std"),
3683 NL ("std"),
3684 NULL, 0 },
3685 { 'a', NL ("std::allocator"),
3686 NL ("std::allocator"),
3687 NL ("allocator") },
3688 { 'b', NL ("std::basic_string"),
3689 NL ("std::basic_string"),
3690 NL ("basic_string") },
3691 { 's', NL ("std::string"),
3692 NL ("std::basic_string<char, std::char_traits<char>, std::allocator<char> >"),
3693 NL ("basic_string") },
3694 { 'i', NL ("std::istream"),
3695 NL ("std::basic_istream<char, std::char_traits<char> >"),
3696 NL ("basic_istream") },
3697 { 'o', NL ("std::ostream"),
3698 NL ("std::basic_ostream<char, std::char_traits<char> >"),
3699 NL ("basic_ostream") },
3700 { 'd', NL ("std::iostream"),
3701 NL ("std::basic_iostream<char, std::char_traits<char> >"),
3702 NL ("basic_iostream") }
3703 };
3704
3705 static struct demangle_component *
3706 d_substitution (struct d_info *di, int prefix)
3707 {
3708 char c;
3709
3710 if (! d_check_char (di, 'S'))
3711 return NULL;
3712
3713 c = d_next_char (di);
3714 if (c == '_' || IS_DIGIT (c) || IS_UPPER (c))
3715 {
3716 unsigned int id;
3717
3718 id = 0;
3719 if (c != '_')
3720 {
3721 do
3722 {
3723 unsigned int new_id;
3724
3725 if (IS_DIGIT (c))
3726 new_id = id * 36 + c - '0';
3727 else if (IS_UPPER (c))
3728 new_id = id * 36 + c - 'A' + 10;
3729 else
3730 return NULL;
3731 if (new_id < id)
3732 return NULL;
3733 id = new_id;
3734 c = d_next_char (di);
3735 }
3736 while (c != '_');
3737
3738 ++id;
3739 }
3740
3741 if (id >= (unsigned int) di->next_sub)
3742 return NULL;
3743
3744 ++di->did_subs;
3745
3746 return di->subs[id];
3747 }
3748 else
3749 {
3750 int verbose;
3751 const struct d_standard_sub_info *p;
3752 const struct d_standard_sub_info *pend;
3753
3754 verbose = (di->options & DMGL_VERBOSE) != 0;
3755 if (! verbose && prefix)
3756 {
3757 char peek;
3758
3759 peek = d_peek_char (di);
3760 if (peek == 'C' || peek == 'D')
3761 verbose = 1;
3762 }
3763
3764 pend = (&standard_subs[0]
3765 + sizeof standard_subs / sizeof standard_subs[0]);
3766 for (p = &standard_subs[0]; p < pend; ++p)
3767 {
3768 if (c == p->code)
3769 {
3770 const char *s;
3771 int len;
3772 struct demangle_component *dc;
3773
3774 if (p->set_last_name != NULL)
3775 di->last_name = d_make_sub (di, p->set_last_name,
3776 p->set_last_name_len);
3777 if (verbose)
3778 {
3779 s = p->full_expansion;
3780 len = p->full_len;
3781 }
3782 else
3783 {
3784 s = p->simple_expansion;
3785 len = p->simple_len;
3786 }
3787 di->expansion += len;
3788 dc = d_make_sub (di, s, len);
3789 if (d_peek_char (di) == 'B')
3790 {
3791 /* If there are ABI tags on the abbreviation, it becomes
3792 a substitution candidate. */
3793 dc = d_abi_tags (di, dc);
3794 d_add_substitution (di, dc);
3795 }
3796 return dc;
3797 }
3798 }
3799
3800 return NULL;
3801 }
3802 }
3803
3804 static void
3805 d_checkpoint (struct d_info *di, struct d_info_checkpoint *checkpoint)
3806 {
3807 checkpoint->n = di->n;
3808 checkpoint->next_comp = di->next_comp;
3809 checkpoint->next_sub = di->next_sub;
3810 checkpoint->did_subs = di->did_subs;
3811 checkpoint->expansion = di->expansion;
3812 }
3813
3814 static void
3815 d_backtrack (struct d_info *di, struct d_info_checkpoint *checkpoint)
3816 {
3817 di->n = checkpoint->n;
3818 di->next_comp = checkpoint->next_comp;
3819 di->next_sub = checkpoint->next_sub;
3820 di->did_subs = checkpoint->did_subs;
3821 di->expansion = checkpoint->expansion;
3822 }
3823
3824 /* Initialize a growable string. */
3825
3826 static void
3827 d_growable_string_init (struct d_growable_string *dgs, size_t estimate)
3828 {
3829 dgs->buf = NULL;
3830 dgs->len = 0;
3831 dgs->alc = 0;
3832 dgs->allocation_failure = 0;
3833
3834 if (estimate > 0)
3835 d_growable_string_resize (dgs, estimate);
3836 }
3837
3838 /* Grow a growable string to a given size. */
3839
3840 static inline void
3841 d_growable_string_resize (struct d_growable_string *dgs, size_t need)
3842 {
3843 size_t newalc;
3844 char *newbuf;
3845
3846 if (dgs->allocation_failure)
3847 return;
3848
3849 /* Start allocation at two bytes to avoid any possibility of confusion
3850 with the special value of 1 used as a return in *palc to indicate
3851 allocation failures. */
3852 newalc = dgs->alc > 0 ? dgs->alc : 2;
3853 while (newalc < need)
3854 newalc <<= 1;
3855
3856 newbuf = (char *) realloc (dgs->buf, newalc);
3857 if (newbuf == NULL)
3858 {
3859 free (dgs->buf);
3860 dgs->buf = NULL;
3861 dgs->len = 0;
3862 dgs->alc = 0;
3863 dgs->allocation_failure = 1;
3864 return;
3865 }
3866 dgs->buf = newbuf;
3867 dgs->alc = newalc;
3868 }
3869
3870 /* Append a buffer to a growable string. */
3871
3872 static inline void
3873 d_growable_string_append_buffer (struct d_growable_string *dgs,
3874 const char *s, size_t l)
3875 {
3876 size_t need;
3877
3878 need = dgs->len + l + 1;
3879 if (need > dgs->alc)
3880 d_growable_string_resize (dgs, need);
3881
3882 if (dgs->allocation_failure)
3883 return;
3884
3885 memcpy (dgs->buf + dgs->len, s, l);
3886 dgs->buf[dgs->len + l] = '\0';
3887 dgs->len += l;
3888 }
3889
3890 /* Bridge growable strings to the callback mechanism. */
3891
3892 static void
3893 d_growable_string_callback_adapter (const char *s, size_t l, void *opaque)
3894 {
3895 struct d_growable_string *dgs = (struct d_growable_string*) opaque;
3896
3897 d_growable_string_append_buffer (dgs, s, l);
3898 }
3899
3900 /* Walk the tree, counting the number of templates encountered, and
3901 the number of times a scope might be saved. These counts will be
3902 used to allocate data structures for d_print_comp, so the logic
3903 here must mirror the logic d_print_comp will use. It is not
3904 important that the resulting numbers are exact, so long as they
3905 are larger than the actual numbers encountered. */
3906
3907 static void
3908 d_count_templates_scopes (int *num_templates, int *num_scopes,
3909 const struct demangle_component *dc)
3910 {
3911 if (dc == NULL)
3912 return;
3913
3914 switch (dc->type)
3915 {
3916 case DEMANGLE_COMPONENT_NAME:
3917 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
3918 case DEMANGLE_COMPONENT_FUNCTION_PARAM:
3919 case DEMANGLE_COMPONENT_SUB_STD:
3920 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
3921 case DEMANGLE_COMPONENT_OPERATOR:
3922 case DEMANGLE_COMPONENT_CHARACTER:
3923 case DEMANGLE_COMPONENT_NUMBER:
3924 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
3925 break;
3926
3927 case DEMANGLE_COMPONENT_TEMPLATE:
3928 (*num_templates)++;
3929 goto recurse_left_right;
3930
3931 case DEMANGLE_COMPONENT_REFERENCE:
3932 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
3933 if (d_left (dc)->type == DEMANGLE_COMPONENT_TEMPLATE_PARAM)
3934 (*num_scopes)++;
3935 goto recurse_left_right;
3936
3937 case DEMANGLE_COMPONENT_QUAL_NAME:
3938 case DEMANGLE_COMPONENT_LOCAL_NAME:
3939 case DEMANGLE_COMPONENT_TYPED_NAME:
3940 case DEMANGLE_COMPONENT_VTABLE:
3941 case DEMANGLE_COMPONENT_VTT:
3942 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
3943 case DEMANGLE_COMPONENT_TYPEINFO:
3944 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
3945 case DEMANGLE_COMPONENT_TYPEINFO_FN:
3946 case DEMANGLE_COMPONENT_THUNK:
3947 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
3948 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
3949 case DEMANGLE_COMPONENT_JAVA_CLASS:
3950 case DEMANGLE_COMPONENT_GUARD:
3951 case DEMANGLE_COMPONENT_TLS_INIT:
3952 case DEMANGLE_COMPONENT_TLS_WRAPPER:
3953 case DEMANGLE_COMPONENT_REFTEMP:
3954 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
3955 case DEMANGLE_COMPONENT_RESTRICT:
3956 case DEMANGLE_COMPONENT_VOLATILE:
3957 case DEMANGLE_COMPONENT_CONST:
3958 case DEMANGLE_COMPONENT_RESTRICT_THIS:
3959 case DEMANGLE_COMPONENT_VOLATILE_THIS:
3960 case DEMANGLE_COMPONENT_CONST_THIS:
3961 case DEMANGLE_COMPONENT_REFERENCE_THIS:
3962 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
3963 case DEMANGLE_COMPONENT_TRANSACTION_SAFE:
3964 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
3965 case DEMANGLE_COMPONENT_POINTER:
3966 case DEMANGLE_COMPONENT_COMPLEX:
3967 case DEMANGLE_COMPONENT_IMAGINARY:
3968 case DEMANGLE_COMPONENT_VENDOR_TYPE:
3969 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
3970 case DEMANGLE_COMPONENT_ARRAY_TYPE:
3971 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
3972 case DEMANGLE_COMPONENT_VECTOR_TYPE:
3973 case DEMANGLE_COMPONENT_ARGLIST:
3974 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
3975 case DEMANGLE_COMPONENT_INITIALIZER_LIST:
3976 case DEMANGLE_COMPONENT_CAST:
3977 case DEMANGLE_COMPONENT_CONVERSION:
3978 case DEMANGLE_COMPONENT_NULLARY:
3979 case DEMANGLE_COMPONENT_UNARY:
3980 case DEMANGLE_COMPONENT_BINARY:
3981 case DEMANGLE_COMPONENT_BINARY_ARGS:
3982 case DEMANGLE_COMPONENT_TRINARY:
3983 case DEMANGLE_COMPONENT_TRINARY_ARG1:
3984 case DEMANGLE_COMPONENT_TRINARY_ARG2:
3985 case DEMANGLE_COMPONENT_LITERAL:
3986 case DEMANGLE_COMPONENT_LITERAL_NEG:
3987 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
3988 case DEMANGLE_COMPONENT_COMPOUND_NAME:
3989 case DEMANGLE_COMPONENT_DECLTYPE:
3990 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
3991 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
3992 case DEMANGLE_COMPONENT_PACK_EXPANSION:
3993 case DEMANGLE_COMPONENT_TAGGED_NAME:
3994 case DEMANGLE_COMPONENT_CLONE:
3995 recurse_left_right:
3996 d_count_templates_scopes (num_templates, num_scopes,
3997 d_left (dc));
3998 d_count_templates_scopes (num_templates, num_scopes,
3999 d_right (dc));
4000 break;
4001
4002 case DEMANGLE_COMPONENT_CTOR:
4003 d_count_templates_scopes (num_templates, num_scopes,
4004 dc->u.s_ctor.name);
4005 break;
4006
4007 case DEMANGLE_COMPONENT_DTOR:
4008 d_count_templates_scopes (num_templates, num_scopes,
4009 dc->u.s_dtor.name);
4010 break;
4011
4012 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
4013 d_count_templates_scopes (num_templates, num_scopes,
4014 dc->u.s_extended_operator.name);
4015 break;
4016
4017 case DEMANGLE_COMPONENT_FIXED_TYPE:
4018 d_count_templates_scopes (num_templates, num_scopes,
4019 dc->u.s_fixed.length);
4020 break;
4021
4022 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
4023 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
4024 d_count_templates_scopes (num_templates, num_scopes,
4025 d_left (dc));
4026 break;
4027
4028 case DEMANGLE_COMPONENT_LAMBDA:
4029 case DEMANGLE_COMPONENT_DEFAULT_ARG:
4030 d_count_templates_scopes (num_templates, num_scopes,
4031 dc->u.s_unary_num.sub);
4032 break;
4033 }
4034 }
4035
4036 /* Initialize a print information structure. */
4037
4038 static void
4039 d_print_init (struct d_print_info *dpi, demangle_callbackref callback,
4040 void *opaque, const struct demangle_component *dc)
4041 {
4042 dpi->len = 0;
4043 dpi->last_char = '\0';
4044 dpi->templates = NULL;
4045 dpi->modifiers = NULL;
4046 dpi->pack_index = 0;
4047 dpi->flush_count = 0;
4048
4049 dpi->callback = callback;
4050 dpi->opaque = opaque;
4051
4052 dpi->demangle_failure = 0;
4053
4054 dpi->component_stack = NULL;
4055
4056 dpi->saved_scopes = NULL;
4057 dpi->next_saved_scope = 0;
4058 dpi->num_saved_scopes = 0;
4059
4060 dpi->copy_templates = NULL;
4061 dpi->next_copy_template = 0;
4062 dpi->num_copy_templates = 0;
4063
4064 d_count_templates_scopes (&dpi->num_copy_templates,
4065 &dpi->num_saved_scopes, dc);
4066 dpi->num_copy_templates *= dpi->num_saved_scopes;
4067
4068 dpi->current_template = NULL;
4069 }
4070
4071 /* Indicate that an error occurred during printing, and test for error. */
4072
4073 static inline void
4074 d_print_error (struct d_print_info *dpi)
4075 {
4076 dpi->demangle_failure = 1;
4077 }
4078
4079 static inline int
4080 d_print_saw_error (struct d_print_info *dpi)
4081 {
4082 return dpi->demangle_failure != 0;
4083 }
4084
4085 /* Flush buffered characters to the callback. */
4086
4087 static inline void
4088 d_print_flush (struct d_print_info *dpi)
4089 {
4090 dpi->buf[dpi->len] = '\0';
4091 dpi->callback (dpi->buf, dpi->len, dpi->opaque);
4092 dpi->len = 0;
4093 dpi->flush_count++;
4094 }
4095
4096 /* Append characters and buffers for printing. */
4097
4098 static inline void
4099 d_append_char (struct d_print_info *dpi, char c)
4100 {
4101 if (dpi->len == sizeof (dpi->buf) - 1)
4102 d_print_flush (dpi);
4103
4104 dpi->buf[dpi->len++] = c;
4105 dpi->last_char = c;
4106 }
4107
4108 static inline void
4109 d_append_buffer (struct d_print_info *dpi, const char *s, size_t l)
4110 {
4111 size_t i;
4112
4113 for (i = 0; i < l; i++)
4114 d_append_char (dpi, s[i]);
4115 }
4116
4117 static inline void
4118 d_append_string (struct d_print_info *dpi, const char *s)
4119 {
4120 d_append_buffer (dpi, s, strlen (s));
4121 }
4122
4123 static inline void
4124 d_append_num (struct d_print_info *dpi, int l)
4125 {
4126 char buf[25];
4127 sprintf (buf,"%d", l);
4128 d_append_string (dpi, buf);
4129 }
4130
4131 static inline char
4132 d_last_char (struct d_print_info *dpi)
4133 {
4134 return dpi->last_char;
4135 }
4136
4137 /* Turn components into a human readable string. OPTIONS is the
4138 options bits passed to the demangler. DC is the tree to print.
4139 CALLBACK is a function to call to flush demangled string segments
4140 as they fill the intermediate buffer, and OPAQUE is a generalized
4141 callback argument. On success, this returns 1. On failure,
4142 it returns 0, indicating a bad parse. It does not use heap
4143 memory to build an output string, so cannot encounter memory
4144 allocation failure. */
4145
4146 CP_STATIC_IF_GLIBCPP_V3
4147 int
4148 cplus_demangle_print_callback (int options,
4149 const struct demangle_component *dc,
4150 demangle_callbackref callback, void *opaque)
4151 {
4152 struct d_print_info dpi;
4153
4154 d_print_init (&dpi, callback, opaque, dc);
4155
4156 {
4157 #ifdef CP_DYNAMIC_ARRAYS
4158 /* Avoid zero-length VLAs, which are prohibited by the C99 standard
4159 and flagged as errors by Address Sanitizer. */
4160 __extension__ struct d_saved_scope scopes[(dpi.num_saved_scopes > 0)
4161 ? dpi.num_saved_scopes : 1];
4162 __extension__ struct d_print_template temps[(dpi.num_copy_templates > 0)
4163 ? dpi.num_copy_templates : 1];
4164
4165 dpi.saved_scopes = scopes;
4166 dpi.copy_templates = temps;
4167 #else
4168 dpi.saved_scopes = alloca (dpi.num_saved_scopes
4169 * sizeof (*dpi.saved_scopes));
4170 dpi.copy_templates = alloca (dpi.num_copy_templates
4171 * sizeof (*dpi.copy_templates));
4172 #endif
4173
4174 d_print_comp (&dpi, options, dc);
4175 }
4176
4177 d_print_flush (&dpi);
4178
4179 return ! d_print_saw_error (&dpi);
4180 }
4181
4182 /* Turn components into a human readable string. OPTIONS is the
4183 options bits passed to the demangler. DC is the tree to print.
4184 ESTIMATE is a guess at the length of the result. This returns a
4185 string allocated by malloc, or NULL on error. On success, this
4186 sets *PALC to the size of the allocated buffer. On failure, this
4187 sets *PALC to 0 for a bad parse, or to 1 for a memory allocation
4188 failure. */
4189
4190 CP_STATIC_IF_GLIBCPP_V3
4191 char *
4192 cplus_demangle_print (int options, const struct demangle_component *dc,
4193 int estimate, size_t *palc)
4194 {
4195 struct d_growable_string dgs;
4196
4197 d_growable_string_init (&dgs, estimate);
4198
4199 if (! cplus_demangle_print_callback (options, dc,
4200 d_growable_string_callback_adapter,
4201 &dgs))
4202 {
4203 free (dgs.buf);
4204 *palc = 0;
4205 return NULL;
4206 }
4207
4208 *palc = dgs.allocation_failure ? 1 : dgs.alc;
4209 return dgs.buf;
4210 }
4211
4212 /* Returns the I'th element of the template arglist ARGS, or NULL on
4213 failure. If I is negative, return the entire arglist. */
4214
4215 static struct demangle_component *
4216 d_index_template_argument (struct demangle_component *args, int i)
4217 {
4218 struct demangle_component *a;
4219
4220 if (i < 0)
4221 /* Print the whole argument pack. */
4222 return args;
4223
4224 for (a = args;
4225 a != NULL;
4226 a = d_right (a))
4227 {
4228 if (a->type != DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4229 return NULL;
4230 if (i <= 0)
4231 break;
4232 --i;
4233 }
4234 if (i != 0 || a == NULL)
4235 return NULL;
4236
4237 return d_left (a);
4238 }
4239
4240 /* Returns the template argument from the current context indicated by DC,
4241 which is a DEMANGLE_COMPONENT_TEMPLATE_PARAM, or NULL. */
4242
4243 static struct demangle_component *
4244 d_lookup_template_argument (struct d_print_info *dpi,
4245 const struct demangle_component *dc)
4246 {
4247 if (dpi->templates == NULL)
4248 {
4249 d_print_error (dpi);
4250 return NULL;
4251 }
4252
4253 return d_index_template_argument
4254 (d_right (dpi->templates->template_decl),
4255 dc->u.s_number.number);
4256 }
4257
4258 /* Returns a template argument pack used in DC (any will do), or NULL. */
4259
4260 static struct demangle_component *
4261 d_find_pack (struct d_print_info *dpi,
4262 const struct demangle_component *dc)
4263 {
4264 struct demangle_component *a;
4265 if (dc == NULL)
4266 return NULL;
4267
4268 switch (dc->type)
4269 {
4270 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
4271 a = d_lookup_template_argument (dpi, dc);
4272 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4273 return a;
4274 return NULL;
4275
4276 case DEMANGLE_COMPONENT_PACK_EXPANSION:
4277 return NULL;
4278
4279 case DEMANGLE_COMPONENT_LAMBDA:
4280 case DEMANGLE_COMPONENT_NAME:
4281 case DEMANGLE_COMPONENT_TAGGED_NAME:
4282 case DEMANGLE_COMPONENT_OPERATOR:
4283 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
4284 case DEMANGLE_COMPONENT_SUB_STD:
4285 case DEMANGLE_COMPONENT_CHARACTER:
4286 case DEMANGLE_COMPONENT_FUNCTION_PARAM:
4287 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
4288 case DEMANGLE_COMPONENT_FIXED_TYPE:
4289 case DEMANGLE_COMPONENT_DEFAULT_ARG:
4290 case DEMANGLE_COMPONENT_NUMBER:
4291 return NULL;
4292
4293 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
4294 return d_find_pack (dpi, dc->u.s_extended_operator.name);
4295 case DEMANGLE_COMPONENT_CTOR:
4296 return d_find_pack (dpi, dc->u.s_ctor.name);
4297 case DEMANGLE_COMPONENT_DTOR:
4298 return d_find_pack (dpi, dc->u.s_dtor.name);
4299
4300 default:
4301 a = d_find_pack (dpi, d_left (dc));
4302 if (a)
4303 return a;
4304 return d_find_pack (dpi, d_right (dc));
4305 }
4306 }
4307
4308 /* Returns the length of the template argument pack DC. */
4309
4310 static int
4311 d_pack_length (const struct demangle_component *dc)
4312 {
4313 int count = 0;
4314 while (dc && dc->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
4315 && d_left (dc) != NULL)
4316 {
4317 ++count;
4318 dc = d_right (dc);
4319 }
4320 return count;
4321 }
4322
4323 /* Returns the number of template args in DC, expanding any pack expansions
4324 found there. */
4325
4326 static int
4327 d_args_length (struct d_print_info *dpi, const struct demangle_component *dc)
4328 {
4329 int count = 0;
4330 for (; dc && dc->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST;
4331 dc = d_right (dc))
4332 {
4333 struct demangle_component *elt = d_left (dc);
4334 if (elt == NULL)
4335 break;
4336 if (elt->type == DEMANGLE_COMPONENT_PACK_EXPANSION)
4337 {
4338 struct demangle_component *a = d_find_pack (dpi, d_left (elt));
4339 count += d_pack_length (a);
4340 }
4341 else
4342 ++count;
4343 }
4344 return count;
4345 }
4346
4347 /* DC is a component of a mangled expression. Print it, wrapped in parens
4348 if needed. */
4349
4350 static void
4351 d_print_subexpr (struct d_print_info *dpi, int options,
4352 const struct demangle_component *dc)
4353 {
4354 int simple = 0;
4355 if (dc->type == DEMANGLE_COMPONENT_NAME
4356 || dc->type == DEMANGLE_COMPONENT_QUAL_NAME
4357 || dc->type == DEMANGLE_COMPONENT_INITIALIZER_LIST
4358 || dc->type == DEMANGLE_COMPONENT_FUNCTION_PARAM)
4359 simple = 1;
4360 if (!simple)
4361 d_append_char (dpi, '(');
4362 d_print_comp (dpi, options, dc);
4363 if (!simple)
4364 d_append_char (dpi, ')');
4365 }
4366
4367 /* Save the current scope. */
4368
4369 static void
4370 d_save_scope (struct d_print_info *dpi,
4371 const struct demangle_component *container)
4372 {
4373 struct d_saved_scope *scope;
4374 struct d_print_template *src, **link;
4375
4376 if (dpi->next_saved_scope >= dpi->num_saved_scopes)
4377 {
4378 d_print_error (dpi);
4379 return;
4380 }
4381 scope = &dpi->saved_scopes[dpi->next_saved_scope];
4382 dpi->next_saved_scope++;
4383
4384 scope->container = container;
4385 link = &scope->templates;
4386
4387 for (src = dpi->templates; src != NULL; src = src->next)
4388 {
4389 struct d_print_template *dst;
4390
4391 if (dpi->next_copy_template >= dpi->num_copy_templates)
4392 {
4393 d_print_error (dpi);
4394 return;
4395 }
4396 dst = &dpi->copy_templates[dpi->next_copy_template];
4397 dpi->next_copy_template++;
4398
4399 dst->template_decl = src->template_decl;
4400 *link = dst;
4401 link = &dst->next;
4402 }
4403
4404 *link = NULL;
4405 }
4406
4407 /* Attempt to locate a previously saved scope. Returns NULL if no
4408 corresponding saved scope was found. */
4409
4410 static struct d_saved_scope *
4411 d_get_saved_scope (struct d_print_info *dpi,
4412 const struct demangle_component *container)
4413 {
4414 int i;
4415
4416 for (i = 0; i < dpi->next_saved_scope; i++)
4417 if (dpi->saved_scopes[i].container == container)
4418 return &dpi->saved_scopes[i];
4419
4420 return NULL;
4421 }
4422
4423 /* If DC is a C++17 fold-expression, print it and return true; otherwise
4424 return false. */
4425
4426 static int
4427 d_maybe_print_fold_expression (struct d_print_info *dpi, int options,
4428 const struct demangle_component *dc)
4429 {
4430 const struct demangle_component *ops, *operator_, *op1, *op2;
4431 int save_idx;
4432
4433 const char *fold_code = d_left (dc)->u.s_operator.op->code;
4434 if (fold_code[0] != 'f')
4435 return 0;
4436
4437 ops = d_right (dc);
4438 operator_ = d_left (ops);
4439 op1 = d_right (ops);
4440 op2 = 0;
4441 if (op1->type == DEMANGLE_COMPONENT_TRINARY_ARG2)
4442 {
4443 op2 = d_right (op1);
4444 op1 = d_left (op1);
4445 }
4446
4447 /* Print the whole pack. */
4448 save_idx = dpi->pack_index;
4449 dpi->pack_index = -1;
4450
4451 switch (fold_code[1])
4452 {
4453 /* Unary left fold, (... + X). */
4454 case 'l':
4455 d_append_string (dpi, "(...");
4456 d_print_expr_op (dpi, options, operator_);
4457 d_print_subexpr (dpi, options, op1);
4458 d_append_char (dpi, ')');
4459 break;
4460
4461 /* Unary right fold, (X + ...). */
4462 case 'r':
4463 d_append_char (dpi, '(');
4464 d_print_subexpr (dpi, options, op1);
4465 d_print_expr_op (dpi, options, operator_);
4466 d_append_string (dpi, "...)");
4467 break;
4468
4469 /* Binary left fold, (42 + ... + X). */
4470 case 'L':
4471 /* Binary right fold, (X + ... + 42). */
4472 case 'R':
4473 d_append_char (dpi, '(');
4474 d_print_subexpr (dpi, options, op1);
4475 d_print_expr_op (dpi, options, operator_);
4476 d_append_string (dpi, "...");
4477 d_print_expr_op (dpi, options, operator_);
4478 d_print_subexpr (dpi, options, op2);
4479 d_append_char (dpi, ')');
4480 break;
4481 }
4482
4483 dpi->pack_index = save_idx;
4484 return 1;
4485 }
4486
4487 /* Subroutine to handle components. */
4488
4489 static void
4490 d_print_comp_inner (struct d_print_info *dpi, int options,
4491 const struct demangle_component *dc)
4492 {
4493 /* Magic variable to let reference smashing skip over the next modifier
4494 without needing to modify *dc. */
4495 const struct demangle_component *mod_inner = NULL;
4496
4497 /* Variable used to store the current templates while a previously
4498 captured scope is used. */
4499 struct d_print_template *saved_templates;
4500
4501 /* Nonzero if templates have been stored in the above variable. */
4502 int need_template_restore = 0;
4503
4504 if (dc == NULL)
4505 {
4506 d_print_error (dpi);
4507 return;
4508 }
4509 if (d_print_saw_error (dpi))
4510 return;
4511
4512 switch (dc->type)
4513 {
4514 case DEMANGLE_COMPONENT_NAME:
4515 if ((options & DMGL_JAVA) == 0)
4516 d_append_buffer (dpi, dc->u.s_name.s, dc->u.s_name.len);
4517 else
4518 d_print_java_identifier (dpi, dc->u.s_name.s, dc->u.s_name.len);
4519 return;
4520
4521 case DEMANGLE_COMPONENT_TAGGED_NAME:
4522 d_print_comp (dpi, options, d_left (dc));
4523 d_append_string (dpi, "[abi:");
4524 d_print_comp (dpi, options, d_right (dc));
4525 d_append_char (dpi, ']');
4526 return;
4527
4528 case DEMANGLE_COMPONENT_QUAL_NAME:
4529 case DEMANGLE_COMPONENT_LOCAL_NAME:
4530 d_print_comp (dpi, options, d_left (dc));
4531 if ((options & DMGL_JAVA) == 0)
4532 d_append_string (dpi, "::");
4533 else
4534 d_append_char (dpi, '.');
4535 {
4536 struct demangle_component *local_name = d_right (dc);
4537 if (local_name->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
4538 {
4539 d_append_string (dpi, "{default arg#");
4540 d_append_num (dpi, local_name->u.s_unary_num.num + 1);
4541 d_append_string (dpi, "}::");
4542 local_name = local_name->u.s_unary_num.sub;
4543 }
4544 d_print_comp (dpi, options, local_name);
4545 }
4546 return;
4547
4548 case DEMANGLE_COMPONENT_TYPED_NAME:
4549 {
4550 struct d_print_mod *hold_modifiers;
4551 struct demangle_component *typed_name;
4552 struct d_print_mod adpm[4];
4553 unsigned int i;
4554 struct d_print_template dpt;
4555
4556 /* Pass the name down to the type so that it can be printed in
4557 the right place for the type. We also have to pass down
4558 any CV-qualifiers, which apply to the this parameter. */
4559 hold_modifiers = dpi->modifiers;
4560 dpi->modifiers = 0;
4561 i = 0;
4562 typed_name = d_left (dc);
4563 while (typed_name != NULL)
4564 {
4565 if (i >= sizeof adpm / sizeof adpm[0])
4566 {
4567 d_print_error (dpi);
4568 return;
4569 }
4570
4571 adpm[i].next = dpi->modifiers;
4572 dpi->modifiers = &adpm[i];
4573 adpm[i].mod = typed_name;
4574 adpm[i].printed = 0;
4575 adpm[i].templates = dpi->templates;
4576 ++i;
4577
4578 if (typed_name->type != DEMANGLE_COMPONENT_RESTRICT_THIS
4579 && typed_name->type != DEMANGLE_COMPONENT_VOLATILE_THIS
4580 && typed_name->type != DEMANGLE_COMPONENT_CONST_THIS
4581 && typed_name->type != DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
4582 && typed_name->type != DEMANGLE_COMPONENT_TRANSACTION_SAFE
4583 && typed_name->type != DEMANGLE_COMPONENT_REFERENCE_THIS)
4584 break;
4585
4586 typed_name = d_left (typed_name);
4587 }
4588
4589 if (typed_name == NULL)
4590 {
4591 d_print_error (dpi);
4592 return;
4593 }
4594
4595 /* If typed_name is a template, then it applies to the
4596 function type as well. */
4597 if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
4598 {
4599 dpt.next = dpi->templates;
4600 dpi->templates = &dpt;
4601 dpt.template_decl = typed_name;
4602 }
4603
4604 /* If typed_name is a DEMANGLE_COMPONENT_LOCAL_NAME, then
4605 there may be CV-qualifiers on its right argument which
4606 really apply here; this happens when parsing a class which
4607 is local to a function. */
4608 if (typed_name->type == DEMANGLE_COMPONENT_LOCAL_NAME)
4609 {
4610 struct demangle_component *local_name;
4611
4612 local_name = d_right (typed_name);
4613 if (local_name->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
4614 local_name = local_name->u.s_unary_num.sub;
4615 if (local_name == NULL)
4616 {
4617 d_print_error (dpi);
4618 return;
4619 }
4620 while (local_name->type == DEMANGLE_COMPONENT_RESTRICT_THIS
4621 || local_name->type == DEMANGLE_COMPONENT_VOLATILE_THIS
4622 || local_name->type == DEMANGLE_COMPONENT_CONST_THIS
4623 || local_name->type == DEMANGLE_COMPONENT_REFERENCE_THIS
4624 || local_name->type == DEMANGLE_COMPONENT_TRANSACTION_SAFE
4625 || (local_name->type
4626 == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS))
4627 {
4628 if (i >= sizeof adpm / sizeof adpm[0])
4629 {
4630 d_print_error (dpi);
4631 return;
4632 }
4633
4634 adpm[i] = adpm[i - 1];
4635 adpm[i].next = &adpm[i - 1];
4636 dpi->modifiers = &adpm[i];
4637
4638 adpm[i - 1].mod = local_name;
4639 adpm[i - 1].printed = 0;
4640 adpm[i - 1].templates = dpi->templates;
4641 ++i;
4642
4643 local_name = d_left (local_name);
4644 }
4645 }
4646
4647 d_print_comp (dpi, options, d_right (dc));
4648
4649 if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
4650 dpi->templates = dpt.next;
4651
4652 /* If the modifiers didn't get printed by the type, print them
4653 now. */
4654 while (i > 0)
4655 {
4656 --i;
4657 if (! adpm[i].printed)
4658 {
4659 d_append_char (dpi, ' ');
4660 d_print_mod (dpi, options, adpm[i].mod);
4661 }
4662 }
4663
4664 dpi->modifiers = hold_modifiers;
4665
4666 return;
4667 }
4668
4669 case DEMANGLE_COMPONENT_TEMPLATE:
4670 {
4671 struct d_print_mod *hold_dpm;
4672 struct demangle_component *dcl;
4673 const struct demangle_component *hold_current;
4674
4675 /* This template may need to be referenced by a cast operator
4676 contained in its subtree. */
4677 hold_current = dpi->current_template;
4678 dpi->current_template = dc;
4679
4680 /* Don't push modifiers into a template definition. Doing so
4681 could give the wrong definition for a template argument.
4682 Instead, treat the template essentially as a name. */
4683
4684 hold_dpm = dpi->modifiers;
4685 dpi->modifiers = NULL;
4686
4687 dcl = d_left (dc);
4688
4689 if ((options & DMGL_JAVA) != 0
4690 && dcl->type == DEMANGLE_COMPONENT_NAME
4691 && dcl->u.s_name.len == 6
4692 && strncmp (dcl->u.s_name.s, "JArray", 6) == 0)
4693 {
4694 /* Special-case Java arrays, so that JArray<TYPE> appears
4695 instead as TYPE[]. */
4696
4697 d_print_comp (dpi, options, d_right (dc));
4698 d_append_string (dpi, "[]");
4699 }
4700 else
4701 {
4702 d_print_comp (dpi, options, dcl);
4703 if (d_last_char (dpi) == '<')
4704 d_append_char (dpi, ' ');
4705 d_append_char (dpi, '<');
4706 d_print_comp (dpi, options, d_right (dc));
4707 /* Avoid generating two consecutive '>' characters, to avoid
4708 the C++ syntactic ambiguity. */
4709 if (d_last_char (dpi) == '>')
4710 d_append_char (dpi, ' ');
4711 d_append_char (dpi, '>');
4712 }
4713
4714 dpi->modifiers = hold_dpm;
4715 dpi->current_template = hold_current;
4716
4717 return;
4718 }
4719
4720 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
4721 {
4722 struct d_print_template *hold_dpt;
4723 struct demangle_component *a = d_lookup_template_argument (dpi, dc);
4724
4725 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4726 a = d_index_template_argument (a, dpi->pack_index);
4727
4728 if (a == NULL)
4729 {
4730 d_print_error (dpi);
4731 return;
4732 }
4733
4734 /* While processing this parameter, we need to pop the list of
4735 templates. This is because the template parameter may
4736 itself be a reference to a parameter of an outer
4737 template. */
4738
4739 hold_dpt = dpi->templates;
4740 dpi->templates = hold_dpt->next;
4741
4742 d_print_comp (dpi, options, a);
4743
4744 dpi->templates = hold_dpt;
4745
4746 return;
4747 }
4748
4749 case DEMANGLE_COMPONENT_CTOR:
4750 d_print_comp (dpi, options, dc->u.s_ctor.name);
4751 return;
4752
4753 case DEMANGLE_COMPONENT_DTOR:
4754 d_append_char (dpi, '~');
4755 d_print_comp (dpi, options, dc->u.s_dtor.name);
4756 return;
4757
4758 case DEMANGLE_COMPONENT_VTABLE:
4759 d_append_string (dpi, "vtable for ");
4760 d_print_comp (dpi, options, d_left (dc));
4761 return;
4762
4763 case DEMANGLE_COMPONENT_VTT:
4764 d_append_string (dpi, "VTT for ");
4765 d_print_comp (dpi, options, d_left (dc));
4766 return;
4767
4768 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
4769 d_append_string (dpi, "construction vtable for ");
4770 d_print_comp (dpi, options, d_left (dc));
4771 d_append_string (dpi, "-in-");
4772 d_print_comp (dpi, options, d_right (dc));
4773 return;
4774
4775 case DEMANGLE_COMPONENT_TYPEINFO:
4776 d_append_string (dpi, "typeinfo for ");
4777 d_print_comp (dpi, options, d_left (dc));
4778 return;
4779
4780 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
4781 d_append_string (dpi, "typeinfo name for ");
4782 d_print_comp (dpi, options, d_left (dc));
4783 return;
4784
4785 case DEMANGLE_COMPONENT_TYPEINFO_FN:
4786 d_append_string (dpi, "typeinfo fn for ");
4787 d_print_comp (dpi, options, d_left (dc));
4788 return;
4789
4790 case DEMANGLE_COMPONENT_THUNK:
4791 d_append_string (dpi, "non-virtual thunk to ");
4792 d_print_comp (dpi, options, d_left (dc));
4793 return;
4794
4795 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
4796 d_append_string (dpi, "virtual thunk to ");
4797 d_print_comp (dpi, options, d_left (dc));
4798 return;
4799
4800 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
4801 d_append_string (dpi, "covariant return thunk to ");
4802 d_print_comp (dpi, options, d_left (dc));
4803 return;
4804
4805 case DEMANGLE_COMPONENT_JAVA_CLASS:
4806 d_append_string (dpi, "java Class for ");
4807 d_print_comp (dpi, options, d_left (dc));
4808 return;
4809
4810 case DEMANGLE_COMPONENT_GUARD:
4811 d_append_string (dpi, "guard variable for ");
4812 d_print_comp (dpi, options, d_left (dc));
4813 return;
4814
4815 case DEMANGLE_COMPONENT_TLS_INIT:
4816 d_append_string (dpi, "TLS init function for ");
4817 d_print_comp (dpi, options, d_left (dc));
4818 return;
4819
4820 case DEMANGLE_COMPONENT_TLS_WRAPPER:
4821 d_append_string (dpi, "TLS wrapper function for ");
4822 d_print_comp (dpi, options, d_left (dc));
4823 return;
4824
4825 case DEMANGLE_COMPONENT_REFTEMP:
4826 d_append_string (dpi, "reference temporary #");
4827 d_print_comp (dpi, options, d_right (dc));
4828 d_append_string (dpi, " for ");
4829 d_print_comp (dpi, options, d_left (dc));
4830 return;
4831
4832 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
4833 d_append_string (dpi, "hidden alias for ");
4834 d_print_comp (dpi, options, d_left (dc));
4835 return;
4836
4837 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
4838 d_append_string (dpi, "transaction clone for ");
4839 d_print_comp (dpi, options, d_left (dc));
4840 return;
4841
4842 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
4843 d_append_string (dpi, "non-transaction clone for ");
4844 d_print_comp (dpi, options, d_left (dc));
4845 return;
4846
4847 case DEMANGLE_COMPONENT_SUB_STD:
4848 d_append_buffer (dpi, dc->u.s_string.string, dc->u.s_string.len);
4849 return;
4850
4851 case DEMANGLE_COMPONENT_RESTRICT:
4852 case DEMANGLE_COMPONENT_VOLATILE:
4853 case DEMANGLE_COMPONENT_CONST:
4854 {
4855 struct d_print_mod *pdpm;
4856
4857 /* When printing arrays, it's possible to have cases where the
4858 same CV-qualifier gets pushed on the stack multiple times.
4859 We only need to print it once. */
4860
4861 for (pdpm = dpi->modifiers; pdpm != NULL; pdpm = pdpm->next)
4862 {
4863 if (! pdpm->printed)
4864 {
4865 if (pdpm->mod->type != DEMANGLE_COMPONENT_RESTRICT
4866 && pdpm->mod->type != DEMANGLE_COMPONENT_VOLATILE
4867 && pdpm->mod->type != DEMANGLE_COMPONENT_CONST)
4868 break;
4869 if (pdpm->mod->type == dc->type)
4870 {
4871 d_print_comp (dpi, options, d_left (dc));
4872 return;
4873 }
4874 }
4875 }
4876 }
4877 goto modifier;
4878
4879 case DEMANGLE_COMPONENT_REFERENCE:
4880 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
4881 {
4882 /* Handle reference smashing: & + && = &. */
4883 const struct demangle_component *sub = d_left (dc);
4884 if (sub->type == DEMANGLE_COMPONENT_TEMPLATE_PARAM)
4885 {
4886 struct d_saved_scope *scope = d_get_saved_scope (dpi, sub);
4887 struct demangle_component *a;
4888
4889 if (scope == NULL)
4890 {
4891 /* This is the first time SUB has been traversed.
4892 We need to capture the current templates so
4893 they can be restored if SUB is reentered as a
4894 substitution. */
4895 d_save_scope (dpi, sub);
4896 if (d_print_saw_error (dpi))
4897 return;
4898 }
4899 else
4900 {
4901 const struct d_component_stack *dcse;
4902 int found_self_or_parent = 0;
4903
4904 /* This traversal is reentering SUB as a substition.
4905 If we are not beneath SUB or DC in the tree then we
4906 need to restore SUB's template stack temporarily. */
4907 for (dcse = dpi->component_stack; dcse != NULL;
4908 dcse = dcse->parent)
4909 {
4910 if (dcse->dc == sub
4911 || (dcse->dc == dc
4912 && dcse != dpi->component_stack))
4913 {
4914 found_self_or_parent = 1;
4915 break;
4916 }
4917 }
4918
4919 if (!found_self_or_parent)
4920 {
4921 saved_templates = dpi->templates;
4922 dpi->templates = scope->templates;
4923 need_template_restore = 1;
4924 }
4925 }
4926
4927 a = d_lookup_template_argument (dpi, sub);
4928 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4929 a = d_index_template_argument (a, dpi->pack_index);
4930
4931 if (a == NULL)
4932 {
4933 if (need_template_restore)
4934 dpi->templates = saved_templates;
4935
4936 d_print_error (dpi);
4937 return;
4938 }
4939
4940 sub = a;
4941 }
4942
4943 if (sub->type == DEMANGLE_COMPONENT_REFERENCE
4944 || sub->type == dc->type)
4945 dc = sub;
4946 else if (sub->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE)
4947 mod_inner = d_left (sub);
4948 }
4949 /* Fall through. */
4950
4951 case DEMANGLE_COMPONENT_RESTRICT_THIS:
4952 case DEMANGLE_COMPONENT_VOLATILE_THIS:
4953 case DEMANGLE_COMPONENT_CONST_THIS:
4954 case DEMANGLE_COMPONENT_REFERENCE_THIS:
4955 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
4956 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
4957 case DEMANGLE_COMPONENT_POINTER:
4958 case DEMANGLE_COMPONENT_COMPLEX:
4959 case DEMANGLE_COMPONENT_IMAGINARY:
4960 case DEMANGLE_COMPONENT_TRANSACTION_SAFE:
4961 modifier:
4962 {
4963 /* We keep a list of modifiers on the stack. */
4964 struct d_print_mod dpm;
4965
4966 dpm.next = dpi->modifiers;
4967 dpi->modifiers = &dpm;
4968 dpm.mod = dc;
4969 dpm.printed = 0;
4970 dpm.templates = dpi->templates;
4971
4972 if (!mod_inner)
4973 mod_inner = d_left (dc);
4974
4975 d_print_comp (dpi, options, mod_inner);
4976
4977 /* If the modifier didn't get printed by the type, print it
4978 now. */
4979 if (! dpm.printed)
4980 d_print_mod (dpi, options, dc);
4981
4982 dpi->modifiers = dpm.next;
4983
4984 if (need_template_restore)
4985 dpi->templates = saved_templates;
4986
4987 return;
4988 }
4989
4990 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
4991 if ((options & DMGL_JAVA) == 0)
4992 d_append_buffer (dpi, dc->u.s_builtin.type->name,
4993 dc->u.s_builtin.type->len);
4994 else
4995 d_append_buffer (dpi, dc->u.s_builtin.type->java_name,
4996 dc->u.s_builtin.type->java_len);
4997 return;
4998
4999 case DEMANGLE_COMPONENT_VENDOR_TYPE:
5000 d_print_comp (dpi, options, d_left (dc));
5001 return;
5002
5003 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
5004 {
5005 if ((options & DMGL_RET_POSTFIX) != 0)
5006 d_print_function_type (dpi,
5007 options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
5008 dc, dpi->modifiers);
5009
5010 /* Print return type if present */
5011 if (d_left (dc) != NULL && (options & DMGL_RET_POSTFIX) != 0)
5012 d_print_comp (dpi, options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
5013 d_left (dc));
5014 else if (d_left (dc) != NULL && (options & DMGL_RET_DROP) == 0)
5015 {
5016 struct d_print_mod dpm;
5017
5018 /* We must pass this type down as a modifier in order to
5019 print it in the right location. */
5020 dpm.next = dpi->modifiers;
5021 dpi->modifiers = &dpm;
5022 dpm.mod = dc;
5023 dpm.printed = 0;
5024 dpm.templates = dpi->templates;
5025
5026 d_print_comp (dpi, options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
5027 d_left (dc));
5028
5029 dpi->modifiers = dpm.next;
5030
5031 if (dpm.printed)
5032 return;
5033
5034 /* In standard prefix notation, there is a space between the
5035 return type and the function signature. */
5036 if ((options & DMGL_RET_POSTFIX) == 0)
5037 d_append_char (dpi, ' ');
5038 }
5039
5040 if ((options & DMGL_RET_POSTFIX) == 0)
5041 d_print_function_type (dpi,
5042 options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
5043 dc, dpi->modifiers);
5044
5045 return;
5046 }
5047
5048 case DEMANGLE_COMPONENT_ARRAY_TYPE:
5049 {
5050 struct d_print_mod *hold_modifiers;
5051 struct d_print_mod adpm[4];
5052 unsigned int i;
5053 struct d_print_mod *pdpm;
5054
5055 /* We must pass this type down as a modifier in order to print
5056 multi-dimensional arrays correctly. If the array itself is
5057 CV-qualified, we act as though the element type were
5058 CV-qualified. We do this by copying the modifiers down
5059 rather than fiddling pointers, so that we don't wind up
5060 with a d_print_mod higher on the stack pointing into our
5061 stack frame after we return. */
5062
5063 hold_modifiers = dpi->modifiers;
5064
5065 adpm[0].next = hold_modifiers;
5066 dpi->modifiers = &adpm[0];
5067 adpm[0].mod = dc;
5068 adpm[0].printed = 0;
5069 adpm[0].templates = dpi->templates;
5070
5071 i = 1;
5072 pdpm = hold_modifiers;
5073 while (pdpm != NULL
5074 && (pdpm->mod->type == DEMANGLE_COMPONENT_RESTRICT
5075 || pdpm->mod->type == DEMANGLE_COMPONENT_VOLATILE
5076 || pdpm->mod->type == DEMANGLE_COMPONENT_CONST))
5077 {
5078 if (! pdpm->printed)
5079 {
5080 if (i >= sizeof adpm / sizeof adpm[0])
5081 {
5082 d_print_error (dpi);
5083 return;
5084 }
5085
5086 adpm[i] = *pdpm;
5087 adpm[i].next = dpi->modifiers;
5088 dpi->modifiers = &adpm[i];
5089 pdpm->printed = 1;
5090 ++i;
5091 }
5092
5093 pdpm = pdpm->next;
5094 }
5095
5096 d_print_comp (dpi, options, d_right (dc));
5097
5098 dpi->modifiers = hold_modifiers;
5099
5100 if (adpm[0].printed)
5101 return;
5102
5103 while (i > 1)
5104 {
5105 --i;
5106 d_print_mod (dpi, options, adpm[i].mod);
5107 }
5108
5109 d_print_array_type (dpi, options, dc, dpi->modifiers);
5110
5111 return;
5112 }
5113
5114 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
5115 case DEMANGLE_COMPONENT_VECTOR_TYPE:
5116 {
5117 struct d_print_mod dpm;
5118
5119 dpm.next = dpi->modifiers;
5120 dpi->modifiers = &dpm;
5121 dpm.mod = dc;
5122 dpm.printed = 0;
5123 dpm.templates = dpi->templates;
5124
5125 d_print_comp (dpi, options, d_right (dc));
5126
5127 /* If the modifier didn't get printed by the type, print it
5128 now. */
5129 if (! dpm.printed)
5130 d_print_mod (dpi, options, dc);
5131
5132 dpi->modifiers = dpm.next;
5133
5134 return;
5135 }
5136
5137 case DEMANGLE_COMPONENT_FIXED_TYPE:
5138 if (dc->u.s_fixed.sat)
5139 d_append_string (dpi, "_Sat ");
5140 /* Don't print "int _Accum". */
5141 if (dc->u.s_fixed.length->u.s_builtin.type
5142 != &cplus_demangle_builtin_types['i'-'a'])
5143 {
5144 d_print_comp (dpi, options, dc->u.s_fixed.length);
5145 d_append_char (dpi, ' ');
5146 }
5147 if (dc->u.s_fixed.accum)
5148 d_append_string (dpi, "_Accum");
5149 else
5150 d_append_string (dpi, "_Fract");
5151 return;
5152
5153 case DEMANGLE_COMPONENT_ARGLIST:
5154 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
5155 if (d_left (dc) != NULL)
5156 d_print_comp (dpi, options, d_left (dc));
5157 if (d_right (dc) != NULL)
5158 {
5159 size_t len;
5160 unsigned long int flush_count;
5161 /* Make sure ", " isn't flushed by d_append_string, otherwise
5162 dpi->len -= 2 wouldn't work. */
5163 if (dpi->len >= sizeof (dpi->buf) - 2)
5164 d_print_flush (dpi);
5165 d_append_string (dpi, ", ");
5166 len = dpi->len;
5167 flush_count = dpi->flush_count;
5168 d_print_comp (dpi, options, d_right (dc));
5169 /* If that didn't print anything (which can happen with empty
5170 template argument packs), remove the comma and space. */
5171 if (dpi->flush_count == flush_count && dpi->len == len)
5172 dpi->len -= 2;
5173 }
5174 return;
5175
5176 case DEMANGLE_COMPONENT_INITIALIZER_LIST:
5177 {
5178 struct demangle_component *type = d_left (dc);
5179 struct demangle_component *list = d_right (dc);
5180
5181 if (type)
5182 d_print_comp (dpi, options, type);
5183 d_append_char (dpi, '{');
5184 d_print_comp (dpi, options, list);
5185 d_append_char (dpi, '}');
5186 }
5187 return;
5188
5189 case DEMANGLE_COMPONENT_OPERATOR:
5190 {
5191 const struct demangle_operator_info *op = dc->u.s_operator.op;
5192 int len = op->len;
5193
5194 d_append_string (dpi, "operator");
5195 /* Add a space before new/delete. */
5196 if (IS_LOWER (op->name[0]))
5197 d_append_char (dpi, ' ');
5198 /* Omit a trailing space. */
5199 if (op->name[len-1] == ' ')
5200 --len;
5201 d_append_buffer (dpi, op->name, len);
5202 return;
5203 }
5204
5205 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
5206 d_append_string (dpi, "operator ");
5207 d_print_comp (dpi, options, dc->u.s_extended_operator.name);
5208 return;
5209
5210 case DEMANGLE_COMPONENT_CONVERSION:
5211 d_append_string (dpi, "operator ");
5212 d_print_conversion (dpi, options, dc);
5213 return;
5214
5215 case DEMANGLE_COMPONENT_NULLARY:
5216 d_print_expr_op (dpi, options, d_left (dc));
5217 return;
5218
5219 case DEMANGLE_COMPONENT_UNARY:
5220 {
5221 struct demangle_component *op = d_left (dc);
5222 struct demangle_component *operand = d_right (dc);
5223 const char *code = NULL;
5224
5225 if (op->type == DEMANGLE_COMPONENT_OPERATOR)
5226 {
5227 code = op->u.s_operator.op->code;
5228 if (!strcmp (code, "ad"))
5229 {
5230 /* Don't print the argument list for the address of a
5231 function. */
5232 if (operand->type == DEMANGLE_COMPONENT_TYPED_NAME
5233 && d_left (operand)->type == DEMANGLE_COMPONENT_QUAL_NAME
5234 && d_right (operand)->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
5235 operand = d_left (operand);
5236 }
5237 if (operand->type == DEMANGLE_COMPONENT_BINARY_ARGS)
5238 {
5239 /* This indicates a suffix operator. */
5240 operand = d_left (operand);
5241 d_print_subexpr (dpi, options, operand);
5242 d_print_expr_op (dpi, options, op);
5243 return;
5244 }
5245 }
5246
5247 /* For sizeof..., just print the pack length. */
5248 if (code && !strcmp (code, "sZ"))
5249 {
5250 struct demangle_component *a = d_find_pack (dpi, operand);
5251 int len = d_pack_length (a);
5252 d_append_num (dpi, len);
5253 return;
5254 }
5255 else if (code && !strcmp (code, "sP"))
5256 {
5257 int len = d_args_length (dpi, operand);
5258 d_append_num (dpi, len);
5259 return;
5260 }
5261
5262 if (op->type != DEMANGLE_COMPONENT_CAST)
5263 d_print_expr_op (dpi, options, op);
5264 else
5265 {
5266 d_append_char (dpi, '(');
5267 d_print_cast (dpi, options, op);
5268 d_append_char (dpi, ')');
5269 }
5270 if (code && !strcmp (code, "gs"))
5271 /* Avoid parens after '::'. */
5272 d_print_comp (dpi, options, operand);
5273 else if (code && !strcmp (code, "st"))
5274 /* Always print parens for sizeof (type). */
5275 {
5276 d_append_char (dpi, '(');
5277 d_print_comp (dpi, options, operand);
5278 d_append_char (dpi, ')');
5279 }
5280 else
5281 d_print_subexpr (dpi, options, operand);
5282 }
5283 return;
5284
5285 case DEMANGLE_COMPONENT_BINARY:
5286 if (d_right (dc)->type != DEMANGLE_COMPONENT_BINARY_ARGS)
5287 {
5288 d_print_error (dpi);
5289 return;
5290 }
5291
5292 if (op_is_new_cast (d_left (dc)))
5293 {
5294 d_print_expr_op (dpi, options, d_left (dc));
5295 d_append_char (dpi, '<');
5296 d_print_comp (dpi, options, d_left (d_right (dc)));
5297 d_append_string (dpi, ">(");
5298 d_print_comp (dpi, options, d_right (d_right (dc)));
5299 d_append_char (dpi, ')');
5300 return;
5301 }
5302
5303 if (d_maybe_print_fold_expression (dpi, options, dc))
5304 return;
5305
5306 /* We wrap an expression which uses the greater-than operator in
5307 an extra layer of parens so that it does not get confused
5308 with the '>' which ends the template parameters. */
5309 if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
5310 && d_left (dc)->u.s_operator.op->len == 1
5311 && d_left (dc)->u.s_operator.op->name[0] == '>')
5312 d_append_char (dpi, '(');
5313
5314 if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") == 0
5315 && d_left (d_right (dc))->type == DEMANGLE_COMPONENT_TYPED_NAME)
5316 {
5317 /* Function call used in an expression should not have printed types
5318 of the function arguments. Values of the function arguments still
5319 get printed below. */
5320
5321 const struct demangle_component *func = d_left (d_right (dc));
5322
5323 if (d_right (func)->type != DEMANGLE_COMPONENT_FUNCTION_TYPE)
5324 d_print_error (dpi);
5325 d_print_subexpr (dpi, options, d_left (func));
5326 }
5327 else
5328 d_print_subexpr (dpi, options, d_left (d_right (dc)));
5329 if (strcmp (d_left (dc)->u.s_operator.op->code, "ix") == 0)
5330 {
5331 d_append_char (dpi, '[');
5332 d_print_comp (dpi, options, d_right (d_right (dc)));
5333 d_append_char (dpi, ']');
5334 }
5335 else
5336 {
5337 if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") != 0)
5338 d_print_expr_op (dpi, options, d_left (dc));
5339 d_print_subexpr (dpi, options, d_right (d_right (dc)));
5340 }
5341
5342 if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
5343 && d_left (dc)->u.s_operator.op->len == 1
5344 && d_left (dc)->u.s_operator.op->name[0] == '>')
5345 d_append_char (dpi, ')');
5346
5347 return;
5348
5349 case DEMANGLE_COMPONENT_BINARY_ARGS:
5350 /* We should only see this as part of DEMANGLE_COMPONENT_BINARY. */
5351 d_print_error (dpi);
5352 return;
5353
5354 case DEMANGLE_COMPONENT_TRINARY:
5355 if (d_right (dc)->type != DEMANGLE_COMPONENT_TRINARY_ARG1
5356 || d_right (d_right (dc))->type != DEMANGLE_COMPONENT_TRINARY_ARG2)
5357 {
5358 d_print_error (dpi);
5359 return;
5360 }
5361 if (d_maybe_print_fold_expression (dpi, options, dc))
5362 return;
5363 {
5364 struct demangle_component *op = d_left (dc);
5365 struct demangle_component *first = d_left (d_right (dc));
5366 struct demangle_component *second = d_left (d_right (d_right (dc)));
5367 struct demangle_component *third = d_right (d_right (d_right (dc)));
5368
5369 if (!strcmp (op->u.s_operator.op->code, "qu"))
5370 {
5371 d_print_subexpr (dpi, options, first);
5372 d_print_expr_op (dpi, options, op);
5373 d_print_subexpr (dpi, options, second);
5374 d_append_string (dpi, " : ");
5375 d_print_subexpr (dpi, options, third);
5376 }
5377 else
5378 {
5379 d_append_string (dpi, "new ");
5380 if (d_left (first) != NULL)
5381 {
5382 d_print_subexpr (dpi, options, first);
5383 d_append_char (dpi, ' ');
5384 }
5385 d_print_comp (dpi, options, second);
5386 if (third)
5387 d_print_subexpr (dpi, options, third);
5388 }
5389 }
5390 return;
5391
5392 case DEMANGLE_COMPONENT_TRINARY_ARG1:
5393 case DEMANGLE_COMPONENT_TRINARY_ARG2:
5394 /* We should only see these are part of DEMANGLE_COMPONENT_TRINARY. */
5395 d_print_error (dpi);
5396 return;
5397
5398 case DEMANGLE_COMPONENT_LITERAL:
5399 case DEMANGLE_COMPONENT_LITERAL_NEG:
5400 {
5401 enum d_builtin_type_print tp;
5402
5403 /* For some builtin types, produce simpler output. */
5404 tp = D_PRINT_DEFAULT;
5405 if (d_left (dc)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE)
5406 {
5407 tp = d_left (dc)->u.s_builtin.type->print;
5408 switch (tp)
5409 {
5410 case D_PRINT_INT:
5411 case D_PRINT_UNSIGNED:
5412 case D_PRINT_LONG:
5413 case D_PRINT_UNSIGNED_LONG:
5414 case D_PRINT_LONG_LONG:
5415 case D_PRINT_UNSIGNED_LONG_LONG:
5416 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME)
5417 {
5418 if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
5419 d_append_char (dpi, '-');
5420 d_print_comp (dpi, options, d_right (dc));
5421 switch (tp)
5422 {
5423 default:
5424 break;
5425 case D_PRINT_UNSIGNED:
5426 d_append_char (dpi, 'u');
5427 break;
5428 case D_PRINT_LONG:
5429 d_append_char (dpi, 'l');
5430 break;
5431 case D_PRINT_UNSIGNED_LONG:
5432 d_append_string (dpi, "ul");
5433 break;
5434 case D_PRINT_LONG_LONG:
5435 d_append_string (dpi, "ll");
5436 break;
5437 case D_PRINT_UNSIGNED_LONG_LONG:
5438 d_append_string (dpi, "ull");
5439 break;
5440 }
5441 return;
5442 }
5443 break;
5444
5445 case D_PRINT_BOOL:
5446 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME
5447 && d_right (dc)->u.s_name.len == 1
5448 && dc->type == DEMANGLE_COMPONENT_LITERAL)
5449 {
5450 switch (d_right (dc)->u.s_name.s[0])
5451 {
5452 case '0':
5453 d_append_string (dpi, "false");
5454 return;
5455 case '1':
5456 d_append_string (dpi, "true");
5457 return;
5458 default:
5459 break;
5460 }
5461 }
5462 break;
5463
5464 default:
5465 break;
5466 }
5467 }
5468
5469 d_append_char (dpi, '(');
5470 d_print_comp (dpi, options, d_left (dc));
5471 d_append_char (dpi, ')');
5472 if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
5473 d_append_char (dpi, '-');
5474 if (tp == D_PRINT_FLOAT)
5475 d_append_char (dpi, '[');
5476 d_print_comp (dpi, options, d_right (dc));
5477 if (tp == D_PRINT_FLOAT)
5478 d_append_char (dpi, ']');
5479 }
5480 return;
5481
5482 case DEMANGLE_COMPONENT_NUMBER:
5483 d_append_num (dpi, dc->u.s_number.number);
5484 return;
5485
5486 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
5487 d_append_string (dpi, "java resource ");
5488 d_print_comp (dpi, options, d_left (dc));
5489 return;
5490
5491 case DEMANGLE_COMPONENT_COMPOUND_NAME:
5492 d_print_comp (dpi, options, d_left (dc));
5493 d_print_comp (dpi, options, d_right (dc));
5494 return;
5495
5496 case DEMANGLE_COMPONENT_CHARACTER:
5497 d_append_char (dpi, dc->u.s_character.character);
5498 return;
5499
5500 case DEMANGLE_COMPONENT_DECLTYPE:
5501 d_append_string (dpi, "decltype (");
5502 d_print_comp (dpi, options, d_left (dc));
5503 d_append_char (dpi, ')');
5504 return;
5505
5506 case DEMANGLE_COMPONENT_PACK_EXPANSION:
5507 {
5508 int len;
5509 int i;
5510 struct demangle_component *a = d_find_pack (dpi, d_left (dc));
5511 if (a == NULL)
5512 {
5513 /* d_find_pack won't find anything if the only packs involved
5514 in this expansion are function parameter packs; in that
5515 case, just print the pattern and "...". */
5516 d_print_subexpr (dpi, options, d_left (dc));
5517 d_append_string (dpi, "...");
5518 return;
5519 }
5520
5521 len = d_pack_length (a);
5522 dc = d_left (dc);
5523 for (i = 0; i < len; ++i)
5524 {
5525 dpi->pack_index = i;
5526 d_print_comp (dpi, options, dc);
5527 if (i < len-1)
5528 d_append_string (dpi, ", ");
5529 }
5530 }
5531 return;
5532
5533 case DEMANGLE_COMPONENT_FUNCTION_PARAM:
5534 {
5535 long num = dc->u.s_number.number;
5536 if (num == 0)
5537 d_append_string (dpi, "this");
5538 else
5539 {
5540 d_append_string (dpi, "{parm#");
5541 d_append_num (dpi, num);
5542 d_append_char (dpi, '}');
5543 }
5544 }
5545 return;
5546
5547 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
5548 d_append_string (dpi, "global constructors keyed to ");
5549 d_print_comp (dpi, options, dc->u.s_binary.left);
5550 return;
5551
5552 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
5553 d_append_string (dpi, "global destructors keyed to ");
5554 d_print_comp (dpi, options, dc->u.s_binary.left);
5555 return;
5556
5557 case DEMANGLE_COMPONENT_LAMBDA:
5558 d_append_string (dpi, "{lambda(");
5559 d_print_comp (dpi, options, dc->u.s_unary_num.sub);
5560 d_append_string (dpi, ")#");
5561 d_append_num (dpi, dc->u.s_unary_num.num + 1);
5562 d_append_char (dpi, '}');
5563 return;
5564
5565 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
5566 d_append_string (dpi, "{unnamed type#");
5567 d_append_num (dpi, dc->u.s_number.number + 1);
5568 d_append_char (dpi, '}');
5569 return;
5570
5571 case DEMANGLE_COMPONENT_CLONE:
5572 d_print_comp (dpi, options, d_left (dc));
5573 d_append_string (dpi, " [clone ");
5574 d_print_comp (dpi, options, d_right (dc));
5575 d_append_char (dpi, ']');
5576 return;
5577
5578 default:
5579 d_print_error (dpi);
5580 return;
5581 }
5582 }
5583
5584 static void
5585 d_print_comp (struct d_print_info *dpi, int options,
5586 const struct demangle_component *dc)
5587 {
5588 struct d_component_stack self;
5589
5590 self.dc = dc;
5591 self.parent = dpi->component_stack;
5592 dpi->component_stack = &self;
5593
5594 d_print_comp_inner (dpi, options, dc);
5595
5596 dpi->component_stack = self.parent;
5597 }
5598
5599 /* Print a Java dentifier. For Java we try to handle encoded extended
5600 Unicode characters. The C++ ABI doesn't mention Unicode encoding,
5601 so we don't it for C++. Characters are encoded as
5602 __U<hex-char>+_. */
5603
5604 static void
5605 d_print_java_identifier (struct d_print_info *dpi, const char *name, int len)
5606 {
5607 const char *p;
5608 const char *end;
5609
5610 end = name + len;
5611 for (p = name; p < end; ++p)
5612 {
5613 if (end - p > 3
5614 && p[0] == '_'
5615 && p[1] == '_'
5616 && p[2] == 'U')
5617 {
5618 unsigned long c;
5619 const char *q;
5620
5621 c = 0;
5622 for (q = p + 3; q < end; ++q)
5623 {
5624 int dig;
5625
5626 if (IS_DIGIT (*q))
5627 dig = *q - '0';
5628 else if (*q >= 'A' && *q <= 'F')
5629 dig = *q - 'A' + 10;
5630 else if (*q >= 'a' && *q <= 'f')
5631 dig = *q - 'a' + 10;
5632 else
5633 break;
5634
5635 c = c * 16 + dig;
5636 }
5637 /* If the Unicode character is larger than 256, we don't try
5638 to deal with it here. FIXME. */
5639 if (q < end && *q == '_' && c < 256)
5640 {
5641 d_append_char (dpi, c);
5642 p = q;
5643 continue;
5644 }
5645 }
5646
5647 d_append_char (dpi, *p);
5648 }
5649 }
5650
5651 /* Print a list of modifiers. SUFFIX is 1 if we are printing
5652 qualifiers on this after printing a function. */
5653
5654 static void
5655 d_print_mod_list (struct d_print_info *dpi, int options,
5656 struct d_print_mod *mods, int suffix)
5657 {
5658 struct d_print_template *hold_dpt;
5659
5660 if (mods == NULL || d_print_saw_error (dpi))
5661 return;
5662
5663 if (mods->printed
5664 || (! suffix
5665 && (mods->mod->type == DEMANGLE_COMPONENT_RESTRICT_THIS
5666 || mods->mod->type == DEMANGLE_COMPONENT_VOLATILE_THIS
5667 || mods->mod->type == DEMANGLE_COMPONENT_CONST_THIS
5668 || mods->mod->type == DEMANGLE_COMPONENT_REFERENCE_THIS
5669 || mods->mod->type == DEMANGLE_COMPONENT_TRANSACTION_SAFE
5670 || (mods->mod->type
5671 == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS))))
5672 {
5673 d_print_mod_list (dpi, options, mods->next, suffix);
5674 return;
5675 }
5676
5677 mods->printed = 1;
5678
5679 hold_dpt = dpi->templates;
5680 dpi->templates = mods->templates;
5681
5682 if (mods->mod->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
5683 {
5684 d_print_function_type (dpi, options, mods->mod, mods->next);
5685 dpi->templates = hold_dpt;
5686 return;
5687 }
5688 else if (mods->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
5689 {
5690 d_print_array_type (dpi, options, mods->mod, mods->next);
5691 dpi->templates = hold_dpt;
5692 return;
5693 }
5694 else if (mods->mod->type == DEMANGLE_COMPONENT_LOCAL_NAME)
5695 {
5696 struct d_print_mod *hold_modifiers;
5697 struct demangle_component *dc;
5698
5699 /* When this is on the modifier stack, we have pulled any
5700 qualifiers off the right argument already. Otherwise, we
5701 print it as usual, but don't let the left argument see any
5702 modifiers. */
5703
5704 hold_modifiers = dpi->modifiers;
5705 dpi->modifiers = NULL;
5706 d_print_comp (dpi, options, d_left (mods->mod));
5707 dpi->modifiers = hold_modifiers;
5708
5709 if ((options & DMGL_JAVA) == 0)
5710 d_append_string (dpi, "::");
5711 else
5712 d_append_char (dpi, '.');
5713
5714 dc = d_right (mods->mod);
5715
5716 if (dc->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
5717 {
5718 d_append_string (dpi, "{default arg#");
5719 d_append_num (dpi, dc->u.s_unary_num.num + 1);
5720 d_append_string (dpi, "}::");
5721 dc = dc->u.s_unary_num.sub;
5722 }
5723
5724 while (dc->type == DEMANGLE_COMPONENT_RESTRICT_THIS
5725 || dc->type == DEMANGLE_COMPONENT_VOLATILE_THIS
5726 || dc->type == DEMANGLE_COMPONENT_CONST_THIS
5727 || dc->type == DEMANGLE_COMPONENT_REFERENCE_THIS
5728 || dc->type == DEMANGLE_COMPONENT_TRANSACTION_SAFE
5729 || dc->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS)
5730 dc = d_left (dc);
5731
5732 d_print_comp (dpi, options, dc);
5733
5734 dpi->templates = hold_dpt;
5735 return;
5736 }
5737
5738 d_print_mod (dpi, options, mods->mod);
5739
5740 dpi->templates = hold_dpt;
5741
5742 d_print_mod_list (dpi, options, mods->next, suffix);
5743 }
5744
5745 /* Print a modifier. */
5746
5747 static void
5748 d_print_mod (struct d_print_info *dpi, int options,
5749 const struct demangle_component *mod)
5750 {
5751 switch (mod->type)
5752 {
5753 case DEMANGLE_COMPONENT_RESTRICT:
5754 case DEMANGLE_COMPONENT_RESTRICT_THIS:
5755 d_append_string (dpi, " restrict");
5756 return;
5757 case DEMANGLE_COMPONENT_VOLATILE:
5758 case DEMANGLE_COMPONENT_VOLATILE_THIS:
5759 d_append_string (dpi, " volatile");
5760 return;
5761 case DEMANGLE_COMPONENT_CONST:
5762 case DEMANGLE_COMPONENT_CONST_THIS:
5763 d_append_string (dpi, " const");
5764 return;
5765 case DEMANGLE_COMPONENT_TRANSACTION_SAFE:
5766 d_append_string (dpi, " transaction_safe");
5767 return;
5768 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
5769 d_append_char (dpi, ' ');
5770 d_print_comp (dpi, options, d_right (mod));
5771 return;
5772 case DEMANGLE_COMPONENT_POINTER:
5773 /* There is no pointer symbol in Java. */
5774 if ((options & DMGL_JAVA) == 0)
5775 d_append_char (dpi, '*');
5776 return;
5777 case DEMANGLE_COMPONENT_REFERENCE_THIS:
5778 /* For the ref-qualifier, put a space before the &. */
5779 d_append_char (dpi, ' ');
5780 /* FALLTHRU */
5781 case DEMANGLE_COMPONENT_REFERENCE:
5782 d_append_char (dpi, '&');
5783 return;
5784 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
5785 d_append_char (dpi, ' ');
5786 /* FALLTHRU */
5787 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
5788 d_append_string (dpi, "&&");
5789 return;
5790 case DEMANGLE_COMPONENT_COMPLEX:
5791 d_append_string (dpi, "complex ");
5792 return;
5793 case DEMANGLE_COMPONENT_IMAGINARY:
5794 d_append_string (dpi, "imaginary ");
5795 return;
5796 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
5797 if (d_last_char (dpi) != '(')
5798 d_append_char (dpi, ' ');
5799 d_print_comp (dpi, options, d_left (mod));
5800 d_append_string (dpi, "::*");
5801 return;
5802 case DEMANGLE_COMPONENT_TYPED_NAME:
5803 d_print_comp (dpi, options, d_left (mod));
5804 return;
5805 case DEMANGLE_COMPONENT_VECTOR_TYPE:
5806 d_append_string (dpi, " __vector(");
5807 d_print_comp (dpi, options, d_left (mod));
5808 d_append_char (dpi, ')');
5809 return;
5810
5811 default:
5812 /* Otherwise, we have something that won't go back on the
5813 modifier stack, so we can just print it. */
5814 d_print_comp (dpi, options, mod);
5815 return;
5816 }
5817 }
5818
5819 /* Print a function type, except for the return type. */
5820
5821 static void
5822 d_print_function_type (struct d_print_info *dpi, int options,
5823 const struct demangle_component *dc,
5824 struct d_print_mod *mods)
5825 {
5826 int need_paren;
5827 int need_space;
5828 struct d_print_mod *p;
5829 struct d_print_mod *hold_modifiers;
5830
5831 need_paren = 0;
5832 need_space = 0;
5833 for (p = mods; p != NULL; p = p->next)
5834 {
5835 if (p->printed)
5836 break;
5837
5838 switch (p->mod->type)
5839 {
5840 case DEMANGLE_COMPONENT_POINTER:
5841 case DEMANGLE_COMPONENT_REFERENCE:
5842 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
5843 need_paren = 1;
5844 break;
5845 case DEMANGLE_COMPONENT_RESTRICT:
5846 case DEMANGLE_COMPONENT_VOLATILE:
5847 case DEMANGLE_COMPONENT_CONST:
5848 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
5849 case DEMANGLE_COMPONENT_COMPLEX:
5850 case DEMANGLE_COMPONENT_IMAGINARY:
5851 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
5852 need_space = 1;
5853 need_paren = 1;
5854 break;
5855 case DEMANGLE_COMPONENT_RESTRICT_THIS:
5856 case DEMANGLE_COMPONENT_VOLATILE_THIS:
5857 case DEMANGLE_COMPONENT_CONST_THIS:
5858 case DEMANGLE_COMPONENT_REFERENCE_THIS:
5859 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
5860 case DEMANGLE_COMPONENT_TRANSACTION_SAFE:
5861 break;
5862 default:
5863 break;
5864 }
5865 if (need_paren)
5866 break;
5867 }
5868
5869 if (need_paren)
5870 {
5871 if (! need_space)
5872 {
5873 if (d_last_char (dpi) != '('
5874 && d_last_char (dpi) != '*')
5875 need_space = 1;
5876 }
5877 if (need_space && d_last_char (dpi) != ' ')
5878 d_append_char (dpi, ' ');
5879 d_append_char (dpi, '(');
5880 }
5881
5882 hold_modifiers = dpi->modifiers;
5883 dpi->modifiers = NULL;
5884
5885 d_print_mod_list (dpi, options, mods, 0);
5886
5887 if (need_paren)
5888 d_append_char (dpi, ')');
5889
5890 d_append_char (dpi, '(');
5891
5892 if (d_right (dc) != NULL)
5893 d_print_comp (dpi, options, d_right (dc));
5894
5895 d_append_char (dpi, ')');
5896
5897 d_print_mod_list (dpi, options, mods, 1);
5898
5899 dpi->modifiers = hold_modifiers;
5900 }
5901
5902 /* Print an array type, except for the element type. */
5903
5904 static void
5905 d_print_array_type (struct d_print_info *dpi, int options,
5906 const struct demangle_component *dc,
5907 struct d_print_mod *mods)
5908 {
5909 int need_space;
5910
5911 need_space = 1;
5912 if (mods != NULL)
5913 {
5914 int need_paren;
5915 struct d_print_mod *p;
5916
5917 need_paren = 0;
5918 for (p = mods; p != NULL; p = p->next)
5919 {
5920 if (! p->printed)
5921 {
5922 if (p->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
5923 {
5924 need_space = 0;
5925 break;
5926 }
5927 else
5928 {
5929 need_paren = 1;
5930 need_space = 1;
5931 break;
5932 }
5933 }
5934 }
5935
5936 if (need_paren)
5937 d_append_string (dpi, " (");
5938
5939 d_print_mod_list (dpi, options, mods, 0);
5940
5941 if (need_paren)
5942 d_append_char (dpi, ')');
5943 }
5944
5945 if (need_space)
5946 d_append_char (dpi, ' ');
5947
5948 d_append_char (dpi, '[');
5949
5950 if (d_left (dc) != NULL)
5951 d_print_comp (dpi, options, d_left (dc));
5952
5953 d_append_char (dpi, ']');
5954 }
5955
5956 /* Print an operator in an expression. */
5957
5958 static void
5959 d_print_expr_op (struct d_print_info *dpi, int options,
5960 const struct demangle_component *dc)
5961 {
5962 if (dc->type == DEMANGLE_COMPONENT_OPERATOR)
5963 d_append_buffer (dpi, dc->u.s_operator.op->name,
5964 dc->u.s_operator.op->len);
5965 else
5966 d_print_comp (dpi, options, dc);
5967 }
5968
5969 /* Print a cast. */
5970
5971 static void
5972 d_print_cast (struct d_print_info *dpi, int options,
5973 const struct demangle_component *dc)
5974 {
5975 d_print_comp (dpi, options, d_left (dc));
5976 }
5977
5978 /* Print a conversion operator. */
5979
5980 static void
5981 d_print_conversion (struct d_print_info *dpi, int options,
5982 const struct demangle_component *dc)
5983 {
5984 struct d_print_template dpt;
5985
5986 /* For a conversion operator, we need the template parameters from
5987 the enclosing template in scope for processing the type. */
5988 if (dpi->current_template != NULL)
5989 {
5990 dpt.next = dpi->templates;
5991 dpi->templates = &dpt;
5992 dpt.template_decl = dpi->current_template;
5993 }
5994
5995 if (d_left (dc)->type != DEMANGLE_COMPONENT_TEMPLATE)
5996 {
5997 d_print_comp (dpi, options, d_left (dc));
5998 if (dpi->current_template != NULL)
5999 dpi->templates = dpt.next;
6000 }
6001 else
6002 {
6003 d_print_comp (dpi, options, d_left (d_left (dc)));
6004
6005 /* For a templated cast operator, we need to remove the template
6006 parameters from scope after printing the operator name,
6007 so we need to handle the template printing here. */
6008 if (dpi->current_template != NULL)
6009 dpi->templates = dpt.next;
6010
6011 if (d_last_char (dpi) == '<')
6012 d_append_char (dpi, ' ');
6013 d_append_char (dpi, '<');
6014 d_print_comp (dpi, options, d_right (d_left (dc)));
6015 /* Avoid generating two consecutive '>' characters, to avoid
6016 the C++ syntactic ambiguity. */
6017 if (d_last_char (dpi) == '>')
6018 d_append_char (dpi, ' ');
6019 d_append_char (dpi, '>');
6020 }
6021 }
6022
6023 /* Initialize the information structure we use to pass around
6024 information. */
6025
6026 CP_STATIC_IF_GLIBCPP_V3
6027 void
6028 cplus_demangle_init_info (const char *mangled, int options, size_t len,
6029 struct d_info *di)
6030 {
6031 di->s = mangled;
6032 di->send = mangled + len;
6033 di->options = options;
6034
6035 di->n = mangled;
6036
6037 /* We can not need more components than twice the number of chars in
6038 the mangled string. Most components correspond directly to
6039 chars, but the ARGLIST types are exceptions. */
6040 di->num_comps = 2 * len;
6041 di->next_comp = 0;
6042
6043 /* Similarly, we can not need more substitutions than there are
6044 chars in the mangled string. */
6045 di->num_subs = len;
6046 di->next_sub = 0;
6047 di->did_subs = 0;
6048
6049 di->last_name = NULL;
6050
6051 di->expansion = 0;
6052 di->is_expression = 0;
6053 di->is_conversion = 0;
6054 }
6055
6056 /* Internal implementation for the demangler. If MANGLED is a g++ v3 ABI
6057 mangled name, return strings in repeated callback giving the demangled
6058 name. OPTIONS is the usual libiberty demangler options. On success,
6059 this returns 1. On failure, returns 0. */
6060
6061 static int
6062 d_demangle_callback (const char *mangled, int options,
6063 demangle_callbackref callback, void *opaque)
6064 {
6065 enum
6066 {
6067 DCT_TYPE,
6068 DCT_MANGLED,
6069 DCT_GLOBAL_CTORS,
6070 DCT_GLOBAL_DTORS
6071 }
6072 type;
6073 struct d_info di;
6074 struct demangle_component *dc;
6075 int status;
6076
6077 if (mangled[0] == '_' && mangled[1] == 'Z')
6078 type = DCT_MANGLED;
6079 else if (strncmp (mangled, "_GLOBAL_", 8) == 0
6080 && (mangled[8] == '.' || mangled[8] == '_' || mangled[8] == '$')
6081 && (mangled[9] == 'D' || mangled[9] == 'I')
6082 && mangled[10] == '_')
6083 type = mangled[9] == 'I' ? DCT_GLOBAL_CTORS : DCT_GLOBAL_DTORS;
6084 else
6085 {
6086 if ((options & DMGL_TYPES) == 0)
6087 return 0;
6088 type = DCT_TYPE;
6089 }
6090
6091 cplus_demangle_init_info (mangled, options, strlen (mangled), &di);
6092
6093 {
6094 #ifdef CP_DYNAMIC_ARRAYS
6095 __extension__ struct demangle_component comps[di.num_comps];
6096 __extension__ struct demangle_component *subs[di.num_subs];
6097
6098 di.comps = comps;
6099 di.subs = subs;
6100 #else
6101 di.comps = alloca (di.num_comps * sizeof (*di.comps));
6102 di.subs = alloca (di.num_subs * sizeof (*di.subs));
6103 #endif
6104
6105 switch (type)
6106 {
6107 case DCT_TYPE:
6108 dc = cplus_demangle_type (&di);
6109 break;
6110 case DCT_MANGLED:
6111 dc = cplus_demangle_mangled_name (&di, 1);
6112 break;
6113 case DCT_GLOBAL_CTORS:
6114 case DCT_GLOBAL_DTORS:
6115 d_advance (&di, 11);
6116 dc = d_make_comp (&di,
6117 (type == DCT_GLOBAL_CTORS
6118 ? DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
6119 : DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS),
6120 d_make_demangle_mangled_name (&di, d_str (&di)),
6121 NULL);
6122 d_advance (&di, strlen (d_str (&di)));
6123 break;
6124 default:
6125 abort (); /* We have listed all the cases. */
6126 }
6127
6128 /* If DMGL_PARAMS is set, then if we didn't consume the entire
6129 mangled string, then we didn't successfully demangle it. If
6130 DMGL_PARAMS is not set, we didn't look at the trailing
6131 parameters. */
6132 if (((options & DMGL_PARAMS) != 0) && d_peek_char (&di) != '\0')
6133 dc = NULL;
6134
6135 #ifdef CP_DEMANGLE_DEBUG
6136 d_dump (dc, 0);
6137 #endif
6138
6139 status = (dc != NULL)
6140 ? cplus_demangle_print_callback (options, dc, callback, opaque)
6141 : 0;
6142 }
6143
6144 return status;
6145 }
6146
6147 /* Entry point for the demangler. If MANGLED is a g++ v3 ABI mangled
6148 name, return a buffer allocated with malloc holding the demangled
6149 name. OPTIONS is the usual libiberty demangler options. On
6150 success, this sets *PALC to the allocated size of the returned
6151 buffer. On failure, this sets *PALC to 0 for a bad name, or 1 for
6152 a memory allocation failure, and returns NULL. */
6153
6154 static char *
6155 d_demangle (const char *mangled, int options, size_t *palc)
6156 {
6157 struct d_growable_string dgs;
6158 int status;
6159
6160 d_growable_string_init (&dgs, 0);
6161
6162 status = d_demangle_callback (mangled, options,
6163 d_growable_string_callback_adapter, &dgs);
6164 if (status == 0)
6165 {
6166 free (dgs.buf);
6167 *palc = 0;
6168 return NULL;
6169 }
6170
6171 *palc = dgs.allocation_failure ? 1 : dgs.alc;
6172 return dgs.buf;
6173 }
6174
6175 #if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3)
6176
6177 extern char *__cxa_demangle (const char *, char *, size_t *, int *);
6178
6179 /* ia64 ABI-mandated entry point in the C++ runtime library for
6180 performing demangling. MANGLED_NAME is a NUL-terminated character
6181 string containing the name to be demangled.
6182
6183 OUTPUT_BUFFER is a region of memory, allocated with malloc, of
6184 *LENGTH bytes, into which the demangled name is stored. If
6185 OUTPUT_BUFFER is not long enough, it is expanded using realloc.
6186 OUTPUT_BUFFER may instead be NULL; in that case, the demangled name
6187 is placed in a region of memory allocated with malloc.
6188
6189 If LENGTH is non-NULL, the length of the buffer containing the
6190 demangled name, is placed in *LENGTH.
6191
6192 The return value is a pointer to the start of the NUL-terminated
6193 demangled name, or NULL if the demangling fails. The caller is
6194 responsible for deallocating this memory using free.
6195
6196 *STATUS is set to one of the following values:
6197 0: The demangling operation succeeded.
6198 -1: A memory allocation failure occurred.
6199 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
6200 -3: One of the arguments is invalid.
6201
6202 The demangling is performed using the C++ ABI mangling rules, with
6203 GNU extensions. */
6204
6205 char *
6206 __cxa_demangle (const char *mangled_name, char *output_buffer,
6207 size_t *length, int *status)
6208 {
6209 char *demangled;
6210 size_t alc;
6211
6212 if (mangled_name == NULL)
6213 {
6214 if (status != NULL)
6215 *status = -3;
6216 return NULL;
6217 }
6218
6219 if (output_buffer != NULL && length == NULL)
6220 {
6221 if (status != NULL)
6222 *status = -3;
6223 return NULL;
6224 }
6225
6226 demangled = d_demangle (mangled_name, DMGL_PARAMS | DMGL_TYPES, &alc);
6227
6228 if (demangled == NULL)
6229 {
6230 if (status != NULL)
6231 {
6232 if (alc == 1)
6233 *status = -1;
6234 else
6235 *status = -2;
6236 }
6237 return NULL;
6238 }
6239
6240 if (output_buffer == NULL)
6241 {
6242 if (length != NULL)
6243 *length = alc;
6244 }
6245 else
6246 {
6247 if (strlen (demangled) < *length)
6248 {
6249 strcpy (output_buffer, demangled);
6250 free (demangled);
6251 demangled = output_buffer;
6252 }
6253 else
6254 {
6255 free (output_buffer);
6256 *length = alc;
6257 }
6258 }
6259
6260 if (status != NULL)
6261 *status = 0;
6262
6263 return demangled;
6264 }
6265
6266 extern int __gcclibcxx_demangle_callback (const char *,
6267 void (*)
6268 (const char *, size_t, void *),
6269 void *);
6270
6271 /* Alternative, allocationless entry point in the C++ runtime library
6272 for performing demangling. MANGLED_NAME is a NUL-terminated character
6273 string containing the name to be demangled.
6274
6275 CALLBACK is a callback function, called with demangled string
6276 segments as demangling progresses; it is called at least once,
6277 but may be called more than once. OPAQUE is a generalized pointer
6278 used as a callback argument.
6279
6280 The return code is one of the following values, equivalent to
6281 the STATUS values of __cxa_demangle() (excluding -1, since this
6282 function performs no memory allocations):
6283 0: The demangling operation succeeded.
6284 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
6285 -3: One of the arguments is invalid.
6286
6287 The demangling is performed using the C++ ABI mangling rules, with
6288 GNU extensions. */
6289
6290 int
6291 __gcclibcxx_demangle_callback (const char *mangled_name,
6292 void (*callback) (const char *, size_t, void *),
6293 void *opaque)
6294 {
6295 int status;
6296
6297 if (mangled_name == NULL || callback == NULL)
6298 return -3;
6299
6300 status = d_demangle_callback (mangled_name, DMGL_PARAMS | DMGL_TYPES,
6301 callback, opaque);
6302 if (status == 0)
6303 return -2;
6304
6305 return 0;
6306 }
6307
6308 #else /* ! (IN_LIBGCC2 || IN_GLIBCPP_V3) */
6309
6310 /* Entry point for libiberty demangler. If MANGLED is a g++ v3 ABI
6311 mangled name, return a buffer allocated with malloc holding the
6312 demangled name. Otherwise, return NULL. */
6313
6314 char *
6315 cplus_demangle_v3 (const char *mangled, int options)
6316 {
6317 size_t alc;
6318
6319 return d_demangle (mangled, options, &alc);
6320 }
6321
6322 int
6323 cplus_demangle_v3_callback (const char *mangled, int options,
6324 demangle_callbackref callback, void *opaque)
6325 {
6326 return d_demangle_callback (mangled, options, callback, opaque);
6327 }
6328
6329 /* Demangle a Java symbol. Java uses a subset of the V3 ABI C++ mangling
6330 conventions, but the output formatting is a little different.
6331 This instructs the C++ demangler not to emit pointer characters ("*"), to
6332 use Java's namespace separator symbol ("." instead of "::"), and to output
6333 JArray<TYPE> as TYPE[]. */
6334
6335 char *
6336 java_demangle_v3 (const char *mangled)
6337 {
6338 size_t alc;
6339
6340 return d_demangle (mangled, DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX, &alc);
6341 }
6342
6343 int
6344 java_demangle_v3_callback (const char *mangled,
6345 demangle_callbackref callback, void *opaque)
6346 {
6347 return d_demangle_callback (mangled,
6348 DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX,
6349 callback, opaque);
6350 }
6351
6352 #endif /* IN_LIBGCC2 || IN_GLIBCPP_V3 */
6353
6354 #ifndef IN_GLIBCPP_V3
6355
6356 /* Demangle a string in order to find out whether it is a constructor
6357 or destructor. Return non-zero on success. Set *CTOR_KIND and
6358 *DTOR_KIND appropriately. */
6359
6360 static int
6361 is_ctor_or_dtor (const char *mangled,
6362 enum gnu_v3_ctor_kinds *ctor_kind,
6363 enum gnu_v3_dtor_kinds *dtor_kind)
6364 {
6365 struct d_info di;
6366 struct demangle_component *dc;
6367 int ret;
6368
6369 *ctor_kind = (enum gnu_v3_ctor_kinds) 0;
6370 *dtor_kind = (enum gnu_v3_dtor_kinds) 0;
6371
6372 cplus_demangle_init_info (mangled, DMGL_GNU_V3, strlen (mangled), &di);
6373
6374 {
6375 #ifdef CP_DYNAMIC_ARRAYS
6376 __extension__ struct demangle_component comps[di.num_comps];
6377 __extension__ struct demangle_component *subs[di.num_subs];
6378
6379 di.comps = comps;
6380 di.subs = subs;
6381 #else
6382 di.comps = alloca (di.num_comps * sizeof (*di.comps));
6383 di.subs = alloca (di.num_subs * sizeof (*di.subs));
6384 #endif
6385
6386 dc = cplus_demangle_mangled_name (&di, 1);
6387
6388 /* Note that because we did not pass DMGL_PARAMS, we don't expect
6389 to demangle the entire string. */
6390
6391 ret = 0;
6392 while (dc != NULL)
6393 {
6394 switch (dc->type)
6395 {
6396 /* These cannot appear on a constructor or destructor. */
6397 case DEMANGLE_COMPONENT_RESTRICT_THIS:
6398 case DEMANGLE_COMPONENT_VOLATILE_THIS:
6399 case DEMANGLE_COMPONENT_CONST_THIS:
6400 case DEMANGLE_COMPONENT_REFERENCE_THIS:
6401 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
6402 case DEMANGLE_COMPONENT_TRANSACTION_SAFE:
6403 default:
6404 dc = NULL;
6405 break;
6406 case DEMANGLE_COMPONENT_TYPED_NAME:
6407 case DEMANGLE_COMPONENT_TEMPLATE:
6408 dc = d_left (dc);
6409 break;
6410 case DEMANGLE_COMPONENT_QUAL_NAME:
6411 case DEMANGLE_COMPONENT_LOCAL_NAME:
6412 dc = d_right (dc);
6413 break;
6414 case DEMANGLE_COMPONENT_CTOR:
6415 *ctor_kind = dc->u.s_ctor.kind;
6416 ret = 1;
6417 dc = NULL;
6418 break;
6419 case DEMANGLE_COMPONENT_DTOR:
6420 *dtor_kind = dc->u.s_dtor.kind;
6421 ret = 1;
6422 dc = NULL;
6423 break;
6424 }
6425 }
6426 }
6427
6428 return ret;
6429 }
6430
6431 /* Return whether NAME is the mangled form of a g++ V3 ABI constructor
6432 name. A non-zero return indicates the type of constructor. */
6433
6434 enum gnu_v3_ctor_kinds
6435 is_gnu_v3_mangled_ctor (const char *name)
6436 {
6437 enum gnu_v3_ctor_kinds ctor_kind;
6438 enum gnu_v3_dtor_kinds dtor_kind;
6439
6440 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
6441 return (enum gnu_v3_ctor_kinds) 0;
6442 return ctor_kind;
6443 }
6444
6445
6446 /* Return whether NAME is the mangled form of a g++ V3 ABI destructor
6447 name. A non-zero return indicates the type of destructor. */
6448
6449 enum gnu_v3_dtor_kinds
6450 is_gnu_v3_mangled_dtor (const char *name)
6451 {
6452 enum gnu_v3_ctor_kinds ctor_kind;
6453 enum gnu_v3_dtor_kinds dtor_kind;
6454
6455 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
6456 return (enum gnu_v3_dtor_kinds) 0;
6457 return dtor_kind;
6458 }
6459
6460 #endif /* IN_GLIBCPP_V3 */
6461
6462 #ifdef STANDALONE_DEMANGLER
6463
6464 #include "getopt.h"
6465 #include "dyn-string.h"
6466
6467 static void print_usage (FILE* fp, int exit_value);
6468
6469 #define IS_ALPHA(CHAR) \
6470 (((CHAR) >= 'a' && (CHAR) <= 'z') \
6471 || ((CHAR) >= 'A' && (CHAR) <= 'Z'))
6472
6473 /* Non-zero if CHAR is a character than can occur in a mangled name. */
6474 #define is_mangled_char(CHAR) \
6475 (IS_ALPHA (CHAR) || IS_DIGIT (CHAR) \
6476 || (CHAR) == '_' || (CHAR) == '.' || (CHAR) == '$')
6477
6478 /* The name of this program, as invoked. */
6479 const char* program_name;
6480
6481 /* Prints usage summary to FP and then exits with EXIT_VALUE. */
6482
6483 static void
6484 print_usage (FILE* fp, int exit_value)
6485 {
6486 fprintf (fp, "Usage: %s [options] [names ...]\n", program_name);
6487 fprintf (fp, "Options:\n");
6488 fprintf (fp, " -h,--help Display this message.\n");
6489 fprintf (fp, " -p,--no-params Don't display function parameters\n");
6490 fprintf (fp, " -v,--verbose Produce verbose demanglings.\n");
6491 fprintf (fp, "If names are provided, they are demangled. Otherwise filters standard input.\n");
6492
6493 exit (exit_value);
6494 }
6495
6496 /* Option specification for getopt_long. */
6497 static const struct option long_options[] =
6498 {
6499 { "help", no_argument, NULL, 'h' },
6500 { "no-params", no_argument, NULL, 'p' },
6501 { "verbose", no_argument, NULL, 'v' },
6502 { NULL, no_argument, NULL, 0 },
6503 };
6504
6505 /* Main entry for a demangling filter executable. It will demangle
6506 its command line arguments, if any. If none are provided, it will
6507 filter stdin to stdout, replacing any recognized mangled C++ names
6508 with their demangled equivalents. */
6509
6510 int
6511 main (int argc, char *argv[])
6512 {
6513 int i;
6514 int opt_char;
6515 int options = DMGL_PARAMS | DMGL_ANSI | DMGL_TYPES;
6516
6517 /* Use the program name of this program, as invoked. */
6518 program_name = argv[0];
6519
6520 /* Parse options. */
6521 do
6522 {
6523 opt_char = getopt_long (argc, argv, "hpv", long_options, NULL);
6524 switch (opt_char)
6525 {
6526 case '?': /* Unrecognized option. */
6527 print_usage (stderr, 1);
6528 break;
6529
6530 case 'h':
6531 print_usage (stdout, 0);
6532 break;
6533
6534 case 'p':
6535 options &= ~ DMGL_PARAMS;
6536 break;
6537
6538 case 'v':
6539 options |= DMGL_VERBOSE;
6540 break;
6541 }
6542 }
6543 while (opt_char != -1);
6544
6545 if (optind == argc)
6546 /* No command line arguments were provided. Filter stdin. */
6547 {
6548 dyn_string_t mangled = dyn_string_new (3);
6549 char *s;
6550
6551 /* Read all of input. */
6552 while (!feof (stdin))
6553 {
6554 char c;
6555
6556 /* Pile characters into mangled until we hit one that can't
6557 occur in a mangled name. */
6558 c = getchar ();
6559 while (!feof (stdin) && is_mangled_char (c))
6560 {
6561 dyn_string_append_char (mangled, c);
6562 if (feof (stdin))
6563 break;
6564 c = getchar ();
6565 }
6566
6567 if (dyn_string_length (mangled) > 0)
6568 {
6569 #ifdef IN_GLIBCPP_V3
6570 s = __cxa_demangle (dyn_string_buf (mangled), NULL, NULL, NULL);
6571 #else
6572 s = cplus_demangle_v3 (dyn_string_buf (mangled), options);
6573 #endif
6574
6575 if (s != NULL)
6576 {
6577 fputs (s, stdout);
6578 free (s);
6579 }
6580 else
6581 {
6582 /* It might not have been a mangled name. Print the
6583 original text. */
6584 fputs (dyn_string_buf (mangled), stdout);
6585 }
6586
6587 dyn_string_clear (mangled);
6588 }
6589
6590 /* If we haven't hit EOF yet, we've read one character that
6591 can't occur in a mangled name, so print it out. */
6592 if (!feof (stdin))
6593 putchar (c);
6594 }
6595
6596 dyn_string_delete (mangled);
6597 }
6598 else
6599 /* Demangle command line arguments. */
6600 {
6601 /* Loop over command line arguments. */
6602 for (i = optind; i < argc; ++i)
6603 {
6604 char *s;
6605 #ifdef IN_GLIBCPP_V3
6606 int status;
6607 #endif
6608
6609 /* Attempt to demangle. */
6610 #ifdef IN_GLIBCPP_V3
6611 s = __cxa_demangle (argv[i], NULL, NULL, &status);
6612 #else
6613 s = cplus_demangle_v3 (argv[i], options);
6614 #endif
6615
6616 /* If it worked, print the demangled name. */
6617 if (s != NULL)
6618 {
6619 printf ("%s\n", s);
6620 free (s);
6621 }
6622 else
6623 {
6624 #ifdef IN_GLIBCPP_V3
6625 fprintf (stderr, "Failed: %s (status %d)\n", argv[i], status);
6626 #else
6627 fprintf (stderr, "Failed: %s\n", argv[i]);
6628 #endif
6629 }
6630 }
6631 }
6632
6633 return 0;
6634 }
6635
6636 #endif /* STANDALONE_DEMANGLER */
This page took 0.180571 seconds and 5 git commands to generate.