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