82107bc35482500127ebe953d966283d1f02b42f
[deliverable/binutils-gdb.git] / libiberty / cp-demangle.c
1 /* Demangler for g++ V3 ABI.
2 Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008
3 Free Software Foundation, Inc.
4 Written by Ian Lance Taylor <ian@wasabisystems.com>.
5
6 This file is part of the libiberty library, which is part of GCC.
7
8 This file is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 In addition to the permissions in the GNU General Public License, the
14 Free Software Foundation gives you unlimited permission to link the
15 compiled version of this file into combinations with other programs,
16 and to distribute those combinations without any restriction coming
17 from the use of this file. (The General Public License restrictions
18 do apply in other respects; for example, they cover modification of
19 the file, and distribution when not linked into a combined
20 executable.)
21
22 This program is distributed in the hope that it will be useful,
23 but WITHOUT ANY WARRANTY; without even the implied warranty of
24 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25 GNU General Public License for more details.
26
27 You should have received a copy of the GNU General Public License
28 along with this program; if not, write to the Free Software
29 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
30 */
31
32 /* This code implements a demangler for the g++ V3 ABI. The ABI is
33 described on this web page:
34 http://www.codesourcery.com/cxx-abi/abi.html#mangling
35
36 This code was written while looking at the demangler written by
37 Alex Samuel <samuel@codesourcery.com>.
38
39 This code first pulls the mangled name apart into a list of
40 components, and then walks the list generating the demangled
41 name.
42
43 This file will normally define the following functions, q.v.:
44 char *cplus_demangle_v3(const char *mangled, int options)
45 char *java_demangle_v3(const char *mangled)
46 int cplus_demangle_v3_callback(const char *mangled, int options,
47 demangle_callbackref callback)
48 int java_demangle_v3_callback(const char *mangled,
49 demangle_callbackref callback)
50 enum gnu_v3_ctor_kinds is_gnu_v3_mangled_ctor (const char *name)
51 enum gnu_v3_dtor_kinds is_gnu_v3_mangled_dtor (const char *name)
52
53 Also, the interface to the component list is public, and defined in
54 demangle.h. The interface consists of these types, which are
55 defined in demangle.h:
56 enum demangle_component_type
57 struct demangle_component
58 demangle_callbackref
59 and these functions defined in this file:
60 cplus_demangle_fill_name
61 cplus_demangle_fill_extended_operator
62 cplus_demangle_fill_ctor
63 cplus_demangle_fill_dtor
64 cplus_demangle_print
65 cplus_demangle_print_callback
66 and other functions defined in the file cp-demint.c.
67
68 This file also defines some other functions and variables which are
69 only to be used by the file cp-demint.c.
70
71 Preprocessor macros you can define while compiling this file:
72
73 IN_LIBGCC2
74 If defined, this file defines the following functions, q.v.:
75 char *__cxa_demangle (const char *mangled, char *buf, size_t *len,
76 int *status)
77 int __gcclibcxx_demangle_callback (const char *,
78 void (*)
79 (const char *, size_t, void *),
80 void *)
81 instead of cplus_demangle_v3[_callback]() and
82 java_demangle_v3[_callback]().
83
84 IN_GLIBCPP_V3
85 If defined, this file defines only __cxa_demangle() and
86 __gcclibcxx_demangle_callback(), and no other publically visible
87 functions or variables.
88
89 STANDALONE_DEMANGLER
90 If defined, this file defines a main() function which demangles
91 any arguments, or, if none, demangles stdin.
92
93 CP_DEMANGLE_DEBUG
94 If defined, turns on debugging mode, which prints information on
95 stdout about the mangled string. This is not generally useful.
96 */
97
98 #if defined (_AIX) && !defined (__GNUC__)
99 #pragma alloca
100 #endif
101
102 #ifdef HAVE_CONFIG_H
103 #include "config.h"
104 #endif
105
106 #include <stdio.h>
107
108 #ifdef HAVE_STDLIB_H
109 #include <stdlib.h>
110 #endif
111 #ifdef HAVE_STRING_H
112 #include <string.h>
113 #endif
114
115 #ifdef HAVE_ALLOCA_H
116 # include <alloca.h>
117 #else
118 # ifndef alloca
119 # ifdef __GNUC__
120 # define alloca __builtin_alloca
121 # else
122 extern char *alloca ();
123 # endif /* __GNUC__ */
124 # endif /* alloca */
125 #endif /* HAVE_ALLOCA_H */
126
127 #include "ansidecl.h"
128 #include "libiberty.h"
129 #include "demangle.h"
130 #include "cp-demangle.h"
131
132 /* If IN_GLIBCPP_V3 is defined, some functions are made static. We
133 also rename them via #define to avoid compiler errors when the
134 static definition conflicts with the extern declaration in a header
135 file. */
136 #ifdef IN_GLIBCPP_V3
137
138 #define CP_STATIC_IF_GLIBCPP_V3 static
139
140 #define cplus_demangle_fill_name d_fill_name
141 static int d_fill_name (struct demangle_component *, const char *, int);
142
143 #define cplus_demangle_fill_extended_operator d_fill_extended_operator
144 static int
145 d_fill_extended_operator (struct demangle_component *, int,
146 struct demangle_component *);
147
148 #define cplus_demangle_fill_ctor d_fill_ctor
149 static int
150 d_fill_ctor (struct demangle_component *, enum gnu_v3_ctor_kinds,
151 struct demangle_component *);
152
153 #define cplus_demangle_fill_dtor d_fill_dtor
154 static int
155 d_fill_dtor (struct demangle_component *, enum gnu_v3_dtor_kinds,
156 struct demangle_component *);
157
158 #define cplus_demangle_mangled_name d_mangled_name
159 static struct demangle_component *d_mangled_name (struct d_info *, int);
160
161 #define cplus_demangle_type d_type
162 static struct demangle_component *d_type (struct d_info *);
163
164 #define cplus_demangle_print d_print
165 static char *d_print (int, const struct demangle_component *, int, size_t *);
166
167 #define cplus_demangle_print_callback d_print_callback
168 static int d_print_callback (int, const struct demangle_component *,
169 demangle_callbackref, void *);
170
171 #define cplus_demangle_init_info d_init_info
172 static void d_init_info (const char *, int, size_t, struct d_info *);
173
174 #else /* ! defined(IN_GLIBCPP_V3) */
175 #define CP_STATIC_IF_GLIBCPP_V3
176 #endif /* ! defined(IN_GLIBCPP_V3) */
177
178 /* See if the compiler supports dynamic arrays. */
179
180 #ifdef __GNUC__
181 #define CP_DYNAMIC_ARRAYS
182 #else
183 #ifdef __STDC__
184 #ifdef __STDC_VERSION__
185 #if __STDC_VERSION__ >= 199901L
186 #define CP_DYNAMIC_ARRAYS
187 #endif /* __STDC__VERSION >= 199901L */
188 #endif /* defined (__STDC_VERSION__) */
189 #endif /* defined (__STDC__) */
190 #endif /* ! defined (__GNUC__) */
191
192 /* We avoid pulling in the ctype tables, to prevent pulling in
193 additional unresolved symbols when this code is used in a library.
194 FIXME: Is this really a valid reason? This comes from the original
195 V3 demangler code.
196
197 As of this writing this file has the following undefined references
198 when compiled with -DIN_GLIBCPP_V3: realloc, free, memcpy, strcpy,
199 strcat, strlen. */
200
201 #define IS_DIGIT(c) ((c) >= '0' && (c) <= '9')
202 #define IS_UPPER(c) ((c) >= 'A' && (c) <= 'Z')
203 #define IS_LOWER(c) ((c) >= 'a' && (c) <= 'z')
204
205 /* The prefix prepended by GCC to an identifier represnting the
206 anonymous namespace. */
207 #define ANONYMOUS_NAMESPACE_PREFIX "_GLOBAL_"
208 #define ANONYMOUS_NAMESPACE_PREFIX_LEN \
209 (sizeof (ANONYMOUS_NAMESPACE_PREFIX) - 1)
210
211 /* Information we keep for the standard substitutions. */
212
213 struct d_standard_sub_info
214 {
215 /* The code for this substitution. */
216 char code;
217 /* The simple string it expands to. */
218 const char *simple_expansion;
219 /* The length of the simple expansion. */
220 int simple_len;
221 /* The results of a full, verbose, expansion. This is used when
222 qualifying a constructor/destructor, or when in verbose mode. */
223 const char *full_expansion;
224 /* The length of the full expansion. */
225 int full_len;
226 /* What to set the last_name field of d_info to; NULL if we should
227 not set it. This is only relevant when qualifying a
228 constructor/destructor. */
229 const char *set_last_name;
230 /* The length of set_last_name. */
231 int set_last_name_len;
232 };
233
234 /* Accessors for subtrees of struct demangle_component. */
235
236 #define d_left(dc) ((dc)->u.s_binary.left)
237 #define d_right(dc) ((dc)->u.s_binary.right)
238
239 /* A list of templates. This is used while printing. */
240
241 struct d_print_template
242 {
243 /* Next template on the list. */
244 struct d_print_template *next;
245 /* This template. */
246 const struct demangle_component *template_decl;
247 };
248
249 /* A list of type modifiers. This is used while printing. */
250
251 struct d_print_mod
252 {
253 /* Next modifier on the list. These are in the reverse of the order
254 in which they appeared in the mangled string. */
255 struct d_print_mod *next;
256 /* The modifier. */
257 const struct demangle_component *mod;
258 /* Whether this modifier was printed. */
259 int printed;
260 /* The list of templates which applies to this modifier. */
261 struct d_print_template *templates;
262 };
263
264 /* We use these structures to hold information during printing. */
265
266 struct d_growable_string
267 {
268 /* Buffer holding the result. */
269 char *buf;
270 /* Current length of data in buffer. */
271 size_t len;
272 /* Allocated size of buffer. */
273 size_t alc;
274 /* Set to 1 if we had a memory allocation failure. */
275 int allocation_failure;
276 };
277
278 enum { D_PRINT_BUFFER_LENGTH = 256 };
279 struct d_print_info
280 {
281 /* The options passed to the demangler. */
282 int options;
283 /* Fixed-length allocated buffer for demangled data, flushed to the
284 callback with a NUL termination once full. */
285 char buf[D_PRINT_BUFFER_LENGTH];
286 /* Current length of data in buffer. */
287 size_t len;
288 /* The last character printed, saved individually so that it survives
289 any buffer flush. */
290 char last_char;
291 /* Callback function to handle demangled buffer flush. */
292 demangle_callbackref callback;
293 /* Opaque callback argument. */
294 void *opaque;
295 /* The current list of templates, if any. */
296 struct d_print_template *templates;
297 /* The current list of modifiers (e.g., pointer, reference, etc.),
298 if any. */
299 struct d_print_mod *modifiers;
300 /* Set to 1 if we saw a demangling error. */
301 int demangle_failure;
302 };
303
304 #ifdef CP_DEMANGLE_DEBUG
305 static void d_dump (struct demangle_component *, int);
306 #endif
307
308 static struct demangle_component *
309 d_make_empty (struct d_info *);
310
311 static struct demangle_component *
312 d_make_comp (struct d_info *, enum demangle_component_type,
313 struct demangle_component *,
314 struct demangle_component *);
315
316 static struct demangle_component *
317 d_make_name (struct d_info *, const char *, int);
318
319 static struct demangle_component *
320 d_make_builtin_type (struct d_info *,
321 const struct demangle_builtin_type_info *);
322
323 static struct demangle_component *
324 d_make_operator (struct d_info *,
325 const struct demangle_operator_info *);
326
327 static struct demangle_component *
328 d_make_extended_operator (struct d_info *, int,
329 struct demangle_component *);
330
331 static struct demangle_component *
332 d_make_ctor (struct d_info *, enum gnu_v3_ctor_kinds,
333 struct demangle_component *);
334
335 static struct demangle_component *
336 d_make_dtor (struct d_info *, enum gnu_v3_dtor_kinds,
337 struct demangle_component *);
338
339 static struct demangle_component *
340 d_make_template_param (struct d_info *, long);
341
342 static struct demangle_component *
343 d_make_sub (struct d_info *, const char *, int);
344
345 static int
346 has_return_type (struct demangle_component *);
347
348 static int
349 is_ctor_dtor_or_conversion (struct demangle_component *);
350
351 static struct demangle_component *d_encoding (struct d_info *, int);
352
353 static struct demangle_component *d_name (struct d_info *);
354
355 static struct demangle_component *d_nested_name (struct d_info *);
356
357 static struct demangle_component *d_prefix (struct d_info *);
358
359 static struct demangle_component *d_unqualified_name (struct d_info *);
360
361 static struct demangle_component *d_source_name (struct d_info *);
362
363 static long d_number (struct d_info *);
364
365 static struct demangle_component *d_identifier (struct d_info *, int);
366
367 static struct demangle_component *d_operator_name (struct d_info *);
368
369 static struct demangle_component *d_special_name (struct d_info *);
370
371 static int d_call_offset (struct d_info *, int);
372
373 static struct demangle_component *d_ctor_dtor_name (struct d_info *);
374
375 static struct demangle_component **
376 d_cv_qualifiers (struct d_info *, struct demangle_component **, int);
377
378 static struct demangle_component *
379 d_function_type (struct d_info *);
380
381 static struct demangle_component *
382 d_bare_function_type (struct d_info *, int);
383
384 static struct demangle_component *
385 d_class_enum_type (struct d_info *);
386
387 static struct demangle_component *d_array_type (struct d_info *);
388
389 static struct demangle_component *
390 d_pointer_to_member_type (struct d_info *);
391
392 static struct demangle_component *
393 d_template_param (struct d_info *);
394
395 static struct demangle_component *d_template_args (struct d_info *);
396
397 static struct demangle_component *
398 d_template_arg (struct d_info *);
399
400 static struct demangle_component *d_expression (struct d_info *);
401
402 static struct demangle_component *d_expr_primary (struct d_info *);
403
404 static struct demangle_component *d_local_name (struct d_info *);
405
406 static int d_discriminator (struct d_info *);
407
408 static int
409 d_add_substitution (struct d_info *, struct demangle_component *);
410
411 static struct demangle_component *d_substitution (struct d_info *, int);
412
413 static void d_growable_string_init (struct d_growable_string *, size_t);
414
415 static inline void
416 d_growable_string_resize (struct d_growable_string *, size_t);
417
418 static inline void
419 d_growable_string_append_buffer (struct d_growable_string *,
420 const char *, size_t);
421 static void
422 d_growable_string_callback_adapter (const char *, size_t, void *);
423
424 static void
425 d_print_init (struct d_print_info *, int, demangle_callbackref, void *);
426
427 static inline void d_print_error (struct d_print_info *);
428
429 static inline int d_print_saw_error (struct d_print_info *);
430
431 static inline void d_print_flush (struct d_print_info *);
432
433 static inline void d_append_char (struct d_print_info *, char);
434
435 static inline void d_append_buffer (struct d_print_info *,
436 const char *, size_t);
437
438 static inline void d_append_string (struct d_print_info *, const char *);
439
440 static inline char d_last_char (struct d_print_info *);
441
442 static void
443 d_print_comp (struct d_print_info *, const struct demangle_component *);
444
445 static void
446 d_print_java_identifier (struct d_print_info *, const char *, int);
447
448 static void
449 d_print_mod_list (struct d_print_info *, struct d_print_mod *, int);
450
451 static void
452 d_print_mod (struct d_print_info *, const struct demangle_component *);
453
454 static void
455 d_print_function_type (struct d_print_info *,
456 const struct demangle_component *,
457 struct d_print_mod *);
458
459 static void
460 d_print_array_type (struct d_print_info *,
461 const struct demangle_component *,
462 struct d_print_mod *);
463
464 static void
465 d_print_expr_op (struct d_print_info *, const struct demangle_component *);
466
467 static void
468 d_print_cast (struct d_print_info *, const struct demangle_component *);
469
470 static int d_demangle_callback (const char *, int,
471 demangle_callbackref, void *);
472 static char *d_demangle (const char *, int, size_t *);
473
474 #ifdef CP_DEMANGLE_DEBUG
475
476 static void
477 d_dump (struct demangle_component *dc, int indent)
478 {
479 int i;
480
481 if (dc == NULL)
482 {
483 if (indent == 0)
484 printf ("failed demangling\n");
485 return;
486 }
487
488 for (i = 0; i < indent; ++i)
489 putchar (' ');
490
491 switch (dc->type)
492 {
493 case DEMANGLE_COMPONENT_NAME:
494 printf ("name '%.*s'\n", dc->u.s_name.len, dc->u.s_name.s);
495 return;
496 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
497 printf ("template parameter %ld\n", dc->u.s_number.number);
498 return;
499 case DEMANGLE_COMPONENT_CTOR:
500 printf ("constructor %d\n", (int) dc->u.s_ctor.kind);
501 d_dump (dc->u.s_ctor.name, indent + 2);
502 return;
503 case DEMANGLE_COMPONENT_DTOR:
504 printf ("destructor %d\n", (int) dc->u.s_dtor.kind);
505 d_dump (dc->u.s_dtor.name, indent + 2);
506 return;
507 case DEMANGLE_COMPONENT_SUB_STD:
508 printf ("standard substitution %s\n", dc->u.s_string.string);
509 return;
510 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
511 printf ("builtin type %s\n", dc->u.s_builtin.type->name);
512 return;
513 case DEMANGLE_COMPONENT_OPERATOR:
514 printf ("operator %s\n", dc->u.s_operator.op->name);
515 return;
516 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
517 printf ("extended operator with %d args\n",
518 dc->u.s_extended_operator.args);
519 d_dump (dc->u.s_extended_operator.name, indent + 2);
520 return;
521
522 case DEMANGLE_COMPONENT_QUAL_NAME:
523 printf ("qualified name\n");
524 break;
525 case DEMANGLE_COMPONENT_LOCAL_NAME:
526 printf ("local name\n");
527 break;
528 case DEMANGLE_COMPONENT_TYPED_NAME:
529 printf ("typed name\n");
530 break;
531 case DEMANGLE_COMPONENT_TEMPLATE:
532 printf ("template\n");
533 break;
534 case DEMANGLE_COMPONENT_VTABLE:
535 printf ("vtable\n");
536 break;
537 case DEMANGLE_COMPONENT_VTT:
538 printf ("VTT\n");
539 break;
540 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
541 printf ("construction vtable\n");
542 break;
543 case DEMANGLE_COMPONENT_TYPEINFO:
544 printf ("typeinfo\n");
545 break;
546 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
547 printf ("typeinfo name\n");
548 break;
549 case DEMANGLE_COMPONENT_TYPEINFO_FN:
550 printf ("typeinfo function\n");
551 break;
552 case DEMANGLE_COMPONENT_THUNK:
553 printf ("thunk\n");
554 break;
555 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
556 printf ("virtual thunk\n");
557 break;
558 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
559 printf ("covariant thunk\n");
560 break;
561 case DEMANGLE_COMPONENT_JAVA_CLASS:
562 printf ("java class\n");
563 break;
564 case DEMANGLE_COMPONENT_GUARD:
565 printf ("guard\n");
566 break;
567 case DEMANGLE_COMPONENT_REFTEMP:
568 printf ("reference temporary\n");
569 break;
570 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
571 printf ("hidden alias\n");
572 break;
573 case DEMANGLE_COMPONENT_RESTRICT:
574 printf ("restrict\n");
575 break;
576 case DEMANGLE_COMPONENT_VOLATILE:
577 printf ("volatile\n");
578 break;
579 case DEMANGLE_COMPONENT_CONST:
580 printf ("const\n");
581 break;
582 case DEMANGLE_COMPONENT_RESTRICT_THIS:
583 printf ("restrict this\n");
584 break;
585 case DEMANGLE_COMPONENT_VOLATILE_THIS:
586 printf ("volatile this\n");
587 break;
588 case DEMANGLE_COMPONENT_CONST_THIS:
589 printf ("const this\n");
590 break;
591 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
592 printf ("vendor type qualifier\n");
593 break;
594 case DEMANGLE_COMPONENT_POINTER:
595 printf ("pointer\n");
596 break;
597 case DEMANGLE_COMPONENT_REFERENCE:
598 printf ("reference\n");
599 break;
600 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
601 printf ("rvalue reference\n");
602 break;
603 case DEMANGLE_COMPONENT_COMPLEX:
604 printf ("complex\n");
605 break;
606 case DEMANGLE_COMPONENT_IMAGINARY:
607 printf ("imaginary\n");
608 break;
609 case DEMANGLE_COMPONENT_VENDOR_TYPE:
610 printf ("vendor type\n");
611 break;
612 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
613 printf ("function type\n");
614 break;
615 case DEMANGLE_COMPONENT_ARRAY_TYPE:
616 printf ("array type\n");
617 break;
618 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
619 printf ("pointer to member type\n");
620 break;
621 case DEMANGLE_COMPONENT_ARGLIST:
622 printf ("argument list\n");
623 break;
624 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
625 printf ("template argument list\n");
626 break;
627 case DEMANGLE_COMPONENT_CAST:
628 printf ("cast\n");
629 break;
630 case DEMANGLE_COMPONENT_UNARY:
631 printf ("unary operator\n");
632 break;
633 case DEMANGLE_COMPONENT_BINARY:
634 printf ("binary operator\n");
635 break;
636 case DEMANGLE_COMPONENT_BINARY_ARGS:
637 printf ("binary operator arguments\n");
638 break;
639 case DEMANGLE_COMPONENT_TRINARY:
640 printf ("trinary operator\n");
641 break;
642 case DEMANGLE_COMPONENT_TRINARY_ARG1:
643 printf ("trinary operator arguments 1\n");
644 break;
645 case DEMANGLE_COMPONENT_TRINARY_ARG2:
646 printf ("trinary operator arguments 1\n");
647 break;
648 case DEMANGLE_COMPONENT_LITERAL:
649 printf ("literal\n");
650 break;
651 case DEMANGLE_COMPONENT_LITERAL_NEG:
652 printf ("negative literal\n");
653 break;
654 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
655 printf ("java resource\n");
656 break;
657 case DEMANGLE_COMPONENT_COMPOUND_NAME:
658 printf ("compound name\n");
659 break;
660 case DEMANGLE_COMPONENT_CHARACTER:
661 printf ("character '%c'\n", dc->u.s_character.character);
662 return;
663 }
664
665 d_dump (d_left (dc), indent + 2);
666 d_dump (d_right (dc), indent + 2);
667 }
668
669 #endif /* CP_DEMANGLE_DEBUG */
670
671 /* Fill in a DEMANGLE_COMPONENT_NAME. */
672
673 CP_STATIC_IF_GLIBCPP_V3
674 int
675 cplus_demangle_fill_name (struct demangle_component *p, const char *s, int len)
676 {
677 if (p == NULL || s == NULL || len == 0)
678 return 0;
679 p->type = DEMANGLE_COMPONENT_NAME;
680 p->u.s_name.s = s;
681 p->u.s_name.len = len;
682 return 1;
683 }
684
685 /* Fill in a DEMANGLE_COMPONENT_EXTENDED_OPERATOR. */
686
687 CP_STATIC_IF_GLIBCPP_V3
688 int
689 cplus_demangle_fill_extended_operator (struct demangle_component *p, int args,
690 struct demangle_component *name)
691 {
692 if (p == NULL || args < 0 || name == NULL)
693 return 0;
694 p->type = DEMANGLE_COMPONENT_EXTENDED_OPERATOR;
695 p->u.s_extended_operator.args = args;
696 p->u.s_extended_operator.name = name;
697 return 1;
698 }
699
700 /* Fill in a DEMANGLE_COMPONENT_CTOR. */
701
702 CP_STATIC_IF_GLIBCPP_V3
703 int
704 cplus_demangle_fill_ctor (struct demangle_component *p,
705 enum gnu_v3_ctor_kinds kind,
706 struct demangle_component *name)
707 {
708 if (p == NULL
709 || name == NULL
710 || (kind < gnu_v3_complete_object_ctor
711 && kind > gnu_v3_complete_object_allocating_ctor))
712 return 0;
713 p->type = DEMANGLE_COMPONENT_CTOR;
714 p->u.s_ctor.kind = kind;
715 p->u.s_ctor.name = name;
716 return 1;
717 }
718
719 /* Fill in a DEMANGLE_COMPONENT_DTOR. */
720
721 CP_STATIC_IF_GLIBCPP_V3
722 int
723 cplus_demangle_fill_dtor (struct demangle_component *p,
724 enum gnu_v3_dtor_kinds kind,
725 struct demangle_component *name)
726 {
727 if (p == NULL
728 || name == NULL
729 || (kind < gnu_v3_deleting_dtor
730 && kind > gnu_v3_base_object_dtor))
731 return 0;
732 p->type = DEMANGLE_COMPONENT_DTOR;
733 p->u.s_dtor.kind = kind;
734 p->u.s_dtor.name = name;
735 return 1;
736 }
737
738 /* Add a new component. */
739
740 static struct demangle_component *
741 d_make_empty (struct d_info *di)
742 {
743 struct demangle_component *p;
744
745 if (di->next_comp >= di->num_comps)
746 return NULL;
747 p = &di->comps[di->next_comp];
748 ++di->next_comp;
749 return p;
750 }
751
752 /* Add a new generic component. */
753
754 static struct demangle_component *
755 d_make_comp (struct d_info *di, enum demangle_component_type type,
756 struct demangle_component *left,
757 struct demangle_component *right)
758 {
759 struct demangle_component *p;
760
761 /* We check for errors here. A typical error would be a NULL return
762 from a subroutine. We catch those here, and return NULL
763 upward. */
764 switch (type)
765 {
766 /* These types require two parameters. */
767 case DEMANGLE_COMPONENT_QUAL_NAME:
768 case DEMANGLE_COMPONENT_LOCAL_NAME:
769 case DEMANGLE_COMPONENT_TYPED_NAME:
770 case DEMANGLE_COMPONENT_TEMPLATE:
771 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
772 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
773 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
774 case DEMANGLE_COMPONENT_UNARY:
775 case DEMANGLE_COMPONENT_BINARY:
776 case DEMANGLE_COMPONENT_BINARY_ARGS:
777 case DEMANGLE_COMPONENT_TRINARY:
778 case DEMANGLE_COMPONENT_TRINARY_ARG1:
779 case DEMANGLE_COMPONENT_TRINARY_ARG2:
780 case DEMANGLE_COMPONENT_LITERAL:
781 case DEMANGLE_COMPONENT_LITERAL_NEG:
782 case DEMANGLE_COMPONENT_COMPOUND_NAME:
783 if (left == NULL || right == NULL)
784 return NULL;
785 break;
786
787 /* These types only require one parameter. */
788 case DEMANGLE_COMPONENT_VTABLE:
789 case DEMANGLE_COMPONENT_VTT:
790 case DEMANGLE_COMPONENT_TYPEINFO:
791 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
792 case DEMANGLE_COMPONENT_TYPEINFO_FN:
793 case DEMANGLE_COMPONENT_THUNK:
794 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
795 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
796 case DEMANGLE_COMPONENT_JAVA_CLASS:
797 case DEMANGLE_COMPONENT_GUARD:
798 case DEMANGLE_COMPONENT_REFTEMP:
799 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
800 case DEMANGLE_COMPONENT_POINTER:
801 case DEMANGLE_COMPONENT_REFERENCE:
802 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
803 case DEMANGLE_COMPONENT_COMPLEX:
804 case DEMANGLE_COMPONENT_IMAGINARY:
805 case DEMANGLE_COMPONENT_VENDOR_TYPE:
806 case DEMANGLE_COMPONENT_ARGLIST:
807 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
808 case DEMANGLE_COMPONENT_CAST:
809 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
810 if (left == NULL)
811 return NULL;
812 break;
813
814 /* This needs a right parameter, but the left parameter can be
815 empty. */
816 case DEMANGLE_COMPONENT_ARRAY_TYPE:
817 if (right == NULL)
818 return NULL;
819 break;
820
821 /* These are allowed to have no parameters--in some cases they
822 will be filled in later. */
823 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
824 case DEMANGLE_COMPONENT_RESTRICT:
825 case DEMANGLE_COMPONENT_VOLATILE:
826 case DEMANGLE_COMPONENT_CONST:
827 case DEMANGLE_COMPONENT_RESTRICT_THIS:
828 case DEMANGLE_COMPONENT_VOLATILE_THIS:
829 case DEMANGLE_COMPONENT_CONST_THIS:
830 break;
831
832 /* Other types should not be seen here. */
833 default:
834 return NULL;
835 }
836
837 p = d_make_empty (di);
838 if (p != NULL)
839 {
840 p->type = type;
841 p->u.s_binary.left = left;
842 p->u.s_binary.right = right;
843 }
844 return p;
845 }
846
847 /* Add a new name component. */
848
849 static struct demangle_component *
850 d_make_name (struct d_info *di, const char *s, int len)
851 {
852 struct demangle_component *p;
853
854 p = d_make_empty (di);
855 if (! cplus_demangle_fill_name (p, s, len))
856 return NULL;
857 return p;
858 }
859
860 /* Add a new builtin type component. */
861
862 static struct demangle_component *
863 d_make_builtin_type (struct d_info *di,
864 const struct demangle_builtin_type_info *type)
865 {
866 struct demangle_component *p;
867
868 if (type == NULL)
869 return NULL;
870 p = d_make_empty (di);
871 if (p != NULL)
872 {
873 p->type = DEMANGLE_COMPONENT_BUILTIN_TYPE;
874 p->u.s_builtin.type = type;
875 }
876 return p;
877 }
878
879 /* Add a new operator component. */
880
881 static struct demangle_component *
882 d_make_operator (struct d_info *di, const struct demangle_operator_info *op)
883 {
884 struct demangle_component *p;
885
886 p = d_make_empty (di);
887 if (p != NULL)
888 {
889 p->type = DEMANGLE_COMPONENT_OPERATOR;
890 p->u.s_operator.op = op;
891 }
892 return p;
893 }
894
895 /* Add a new extended operator component. */
896
897 static struct demangle_component *
898 d_make_extended_operator (struct d_info *di, int args,
899 struct demangle_component *name)
900 {
901 struct demangle_component *p;
902
903 p = d_make_empty (di);
904 if (! cplus_demangle_fill_extended_operator (p, args, name))
905 return NULL;
906 return p;
907 }
908
909 /* Add a new constructor component. */
910
911 static struct demangle_component *
912 d_make_ctor (struct d_info *di, enum gnu_v3_ctor_kinds kind,
913 struct demangle_component *name)
914 {
915 struct demangle_component *p;
916
917 p = d_make_empty (di);
918 if (! cplus_demangle_fill_ctor (p, kind, name))
919 return NULL;
920 return p;
921 }
922
923 /* Add a new destructor component. */
924
925 static struct demangle_component *
926 d_make_dtor (struct d_info *di, enum gnu_v3_dtor_kinds kind,
927 struct demangle_component *name)
928 {
929 struct demangle_component *p;
930
931 p = d_make_empty (di);
932 if (! cplus_demangle_fill_dtor (p, kind, name))
933 return NULL;
934 return p;
935 }
936
937 /* Add a new template parameter. */
938
939 static struct demangle_component *
940 d_make_template_param (struct d_info *di, long i)
941 {
942 struct demangle_component *p;
943
944 p = d_make_empty (di);
945 if (p != NULL)
946 {
947 p->type = DEMANGLE_COMPONENT_TEMPLATE_PARAM;
948 p->u.s_number.number = i;
949 }
950 return p;
951 }
952
953 /* Add a new standard substitution component. */
954
955 static struct demangle_component *
956 d_make_sub (struct d_info *di, const char *name, int len)
957 {
958 struct demangle_component *p;
959
960 p = d_make_empty (di);
961 if (p != NULL)
962 {
963 p->type = DEMANGLE_COMPONENT_SUB_STD;
964 p->u.s_string.string = name;
965 p->u.s_string.len = len;
966 }
967 return p;
968 }
969
970 /* <mangled-name> ::= _Z <encoding>
971
972 TOP_LEVEL is non-zero when called at the top level. */
973
974 CP_STATIC_IF_GLIBCPP_V3
975 struct demangle_component *
976 cplus_demangle_mangled_name (struct d_info *di, int top_level)
977 {
978 if (! d_check_char (di, '_'))
979 return NULL;
980 if (! d_check_char (di, 'Z'))
981 return NULL;
982 return d_encoding (di, top_level);
983 }
984
985 /* Return whether a function should have a return type. The argument
986 is the function name, which may be qualified in various ways. The
987 rules are that template functions have return types with some
988 exceptions, function types which are not part of a function name
989 mangling have return types with some exceptions, and non-template
990 function names do not have return types. The exceptions are that
991 constructors, destructors, and conversion operators do not have
992 return types. */
993
994 static int
995 has_return_type (struct demangle_component *dc)
996 {
997 if (dc == NULL)
998 return 0;
999 switch (dc->type)
1000 {
1001 default:
1002 return 0;
1003 case DEMANGLE_COMPONENT_TEMPLATE:
1004 return ! is_ctor_dtor_or_conversion (d_left (dc));
1005 case DEMANGLE_COMPONENT_RESTRICT_THIS:
1006 case DEMANGLE_COMPONENT_VOLATILE_THIS:
1007 case DEMANGLE_COMPONENT_CONST_THIS:
1008 return has_return_type (d_left (dc));
1009 }
1010 }
1011
1012 /* Return whether a name is a constructor, a destructor, or a
1013 conversion operator. */
1014
1015 static int
1016 is_ctor_dtor_or_conversion (struct demangle_component *dc)
1017 {
1018 if (dc == NULL)
1019 return 0;
1020 switch (dc->type)
1021 {
1022 default:
1023 return 0;
1024 case DEMANGLE_COMPONENT_QUAL_NAME:
1025 case DEMANGLE_COMPONENT_LOCAL_NAME:
1026 return is_ctor_dtor_or_conversion (d_right (dc));
1027 case DEMANGLE_COMPONENT_CTOR:
1028 case DEMANGLE_COMPONENT_DTOR:
1029 case DEMANGLE_COMPONENT_CAST:
1030 return 1;
1031 }
1032 }
1033
1034 /* <encoding> ::= <(function) name> <bare-function-type>
1035 ::= <(data) name>
1036 ::= <special-name>
1037
1038 TOP_LEVEL is non-zero when called at the top level, in which case
1039 if DMGL_PARAMS is not set we do not demangle the function
1040 parameters. We only set this at the top level, because otherwise
1041 we would not correctly demangle names in local scopes. */
1042
1043 static struct demangle_component *
1044 d_encoding (struct d_info *di, int top_level)
1045 {
1046 char peek = d_peek_char (di);
1047
1048 if (peek == 'G' || peek == 'T')
1049 return d_special_name (di);
1050 else
1051 {
1052 struct demangle_component *dc;
1053
1054 dc = d_name (di);
1055
1056 if (dc != NULL && top_level && (di->options & DMGL_PARAMS) == 0)
1057 {
1058 /* Strip off any initial CV-qualifiers, as they really apply
1059 to the `this' parameter, and they were not output by the
1060 v2 demangler without DMGL_PARAMS. */
1061 while (dc->type == DEMANGLE_COMPONENT_RESTRICT_THIS
1062 || dc->type == DEMANGLE_COMPONENT_VOLATILE_THIS
1063 || dc->type == DEMANGLE_COMPONENT_CONST_THIS)
1064 dc = d_left (dc);
1065
1066 /* If the top level is a DEMANGLE_COMPONENT_LOCAL_NAME, then
1067 there may be CV-qualifiers on its right argument which
1068 really apply here; this happens when parsing a class
1069 which is local to a function. */
1070 if (dc->type == DEMANGLE_COMPONENT_LOCAL_NAME)
1071 {
1072 struct demangle_component *dcr;
1073
1074 dcr = d_right (dc);
1075 while (dcr->type == DEMANGLE_COMPONENT_RESTRICT_THIS
1076 || dcr->type == DEMANGLE_COMPONENT_VOLATILE_THIS
1077 || dcr->type == DEMANGLE_COMPONENT_CONST_THIS)
1078 dcr = d_left (dcr);
1079 dc->u.s_binary.right = dcr;
1080 }
1081
1082 return dc;
1083 }
1084
1085 peek = d_peek_char (di);
1086 if (dc == NULL || peek == '\0' || peek == 'E')
1087 return dc;
1088 return d_make_comp (di, DEMANGLE_COMPONENT_TYPED_NAME, dc,
1089 d_bare_function_type (di, has_return_type (dc)));
1090 }
1091 }
1092
1093 /* <name> ::= <nested-name>
1094 ::= <unscoped-name>
1095 ::= <unscoped-template-name> <template-args>
1096 ::= <local-name>
1097
1098 <unscoped-name> ::= <unqualified-name>
1099 ::= St <unqualified-name>
1100
1101 <unscoped-template-name> ::= <unscoped-name>
1102 ::= <substitution>
1103 */
1104
1105 static struct demangle_component *
1106 d_name (struct d_info *di)
1107 {
1108 char peek = d_peek_char (di);
1109 struct demangle_component *dc;
1110
1111 switch (peek)
1112 {
1113 case 'N':
1114 return d_nested_name (di);
1115
1116 case 'Z':
1117 return d_local_name (di);
1118
1119 case 'L':
1120 return d_unqualified_name (di);
1121
1122 case 'S':
1123 {
1124 int subst;
1125
1126 if (d_peek_next_char (di) != 't')
1127 {
1128 dc = d_substitution (di, 0);
1129 subst = 1;
1130 }
1131 else
1132 {
1133 d_advance (di, 2);
1134 dc = d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME,
1135 d_make_name (di, "std", 3),
1136 d_unqualified_name (di));
1137 di->expansion += 3;
1138 subst = 0;
1139 }
1140
1141 if (d_peek_char (di) != 'I')
1142 {
1143 /* The grammar does not permit this case to occur if we
1144 called d_substitution() above (i.e., subst == 1). We
1145 don't bother to check. */
1146 }
1147 else
1148 {
1149 /* This is <template-args>, which means that we just saw
1150 <unscoped-template-name>, which is a substitution
1151 candidate if we didn't just get it from a
1152 substitution. */
1153 if (! subst)
1154 {
1155 if (! d_add_substitution (di, dc))
1156 return NULL;
1157 }
1158 dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc,
1159 d_template_args (di));
1160 }
1161
1162 return dc;
1163 }
1164
1165 default:
1166 dc = d_unqualified_name (di);
1167 if (d_peek_char (di) == 'I')
1168 {
1169 /* This is <template-args>, which means that we just saw
1170 <unscoped-template-name>, which is a substitution
1171 candidate. */
1172 if (! d_add_substitution (di, dc))
1173 return NULL;
1174 dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc,
1175 d_template_args (di));
1176 }
1177 return dc;
1178 }
1179 }
1180
1181 /* <nested-name> ::= N [<CV-qualifiers>] <prefix> <unqualified-name> E
1182 ::= N [<CV-qualifiers>] <template-prefix> <template-args> E
1183 */
1184
1185 static struct demangle_component *
1186 d_nested_name (struct d_info *di)
1187 {
1188 struct demangle_component *ret;
1189 struct demangle_component **pret;
1190
1191 if (! d_check_char (di, 'N'))
1192 return NULL;
1193
1194 pret = d_cv_qualifiers (di, &ret, 1);
1195 if (pret == NULL)
1196 return NULL;
1197
1198 *pret = d_prefix (di);
1199 if (*pret == NULL)
1200 return NULL;
1201
1202 if (! d_check_char (di, 'E'))
1203 return NULL;
1204
1205 return ret;
1206 }
1207
1208 /* <prefix> ::= <prefix> <unqualified-name>
1209 ::= <template-prefix> <template-args>
1210 ::= <template-param>
1211 ::=
1212 ::= <substitution>
1213
1214 <template-prefix> ::= <prefix> <(template) unqualified-name>
1215 ::= <template-param>
1216 ::= <substitution>
1217 */
1218
1219 static struct demangle_component *
1220 d_prefix (struct d_info *di)
1221 {
1222 struct demangle_component *ret = NULL;
1223
1224 while (1)
1225 {
1226 char peek;
1227 enum demangle_component_type comb_type;
1228 struct demangle_component *dc;
1229
1230 peek = d_peek_char (di);
1231 if (peek == '\0')
1232 return NULL;
1233
1234 /* The older code accepts a <local-name> here, but I don't see
1235 that in the grammar. The older code does not accept a
1236 <template-param> here. */
1237
1238 comb_type = DEMANGLE_COMPONENT_QUAL_NAME;
1239 if (IS_DIGIT (peek)
1240 || IS_LOWER (peek)
1241 || peek == 'C'
1242 || peek == 'D'
1243 || peek == 'L')
1244 dc = d_unqualified_name (di);
1245 else if (peek == 'S')
1246 dc = d_substitution (di, 1);
1247 else if (peek == 'I')
1248 {
1249 if (ret == NULL)
1250 return NULL;
1251 comb_type = DEMANGLE_COMPONENT_TEMPLATE;
1252 dc = d_template_args (di);
1253 }
1254 else if (peek == 'T')
1255 dc = d_template_param (di);
1256 else if (peek == 'E')
1257 return ret;
1258 else
1259 return NULL;
1260
1261 if (ret == NULL)
1262 ret = dc;
1263 else
1264 ret = d_make_comp (di, comb_type, ret, dc);
1265
1266 if (peek != 'S' && d_peek_char (di) != 'E')
1267 {
1268 if (! d_add_substitution (di, ret))
1269 return NULL;
1270 }
1271 }
1272 }
1273
1274 /* <unqualified-name> ::= <operator-name>
1275 ::= <ctor-dtor-name>
1276 ::= <source-name>
1277 ::= <local-source-name>
1278
1279 <local-source-name> ::= L <source-name> <discriminator>
1280 */
1281
1282 static struct demangle_component *
1283 d_unqualified_name (struct d_info *di)
1284 {
1285 char peek;
1286
1287 peek = d_peek_char (di);
1288 if (IS_DIGIT (peek))
1289 return d_source_name (di);
1290 else if (IS_LOWER (peek))
1291 {
1292 struct demangle_component *ret;
1293
1294 ret = d_operator_name (di);
1295 if (ret != NULL && ret->type == DEMANGLE_COMPONENT_OPERATOR)
1296 di->expansion += sizeof "operator" + ret->u.s_operator.op->len - 2;
1297 return ret;
1298 }
1299 else if (peek == 'C' || peek == 'D')
1300 return d_ctor_dtor_name (di);
1301 else if (peek == 'L')
1302 {
1303 struct demangle_component * ret;
1304
1305 d_advance (di, 1);
1306
1307 ret = d_source_name (di);
1308 if (ret == NULL)
1309 return NULL;
1310 if (! d_discriminator (di))
1311 return NULL;
1312 return ret;
1313 }
1314 else
1315 return NULL;
1316 }
1317
1318 /* <source-name> ::= <(positive length) number> <identifier> */
1319
1320 static struct demangle_component *
1321 d_source_name (struct d_info *di)
1322 {
1323 long len;
1324 struct demangle_component *ret;
1325
1326 len = d_number (di);
1327 if (len <= 0)
1328 return NULL;
1329 ret = d_identifier (di, len);
1330 di->last_name = ret;
1331 return ret;
1332 }
1333
1334 /* number ::= [n] <(non-negative decimal integer)> */
1335
1336 static long
1337 d_number (struct d_info *di)
1338 {
1339 int negative;
1340 char peek;
1341 long ret;
1342
1343 negative = 0;
1344 peek = d_peek_char (di);
1345 if (peek == 'n')
1346 {
1347 negative = 1;
1348 d_advance (di, 1);
1349 peek = d_peek_char (di);
1350 }
1351
1352 ret = 0;
1353 while (1)
1354 {
1355 if (! IS_DIGIT (peek))
1356 {
1357 if (negative)
1358 ret = - ret;
1359 return ret;
1360 }
1361 ret = ret * 10 + peek - '0';
1362 d_advance (di, 1);
1363 peek = d_peek_char (di);
1364 }
1365 }
1366
1367 /* identifier ::= <(unqualified source code identifier)> */
1368
1369 static struct demangle_component *
1370 d_identifier (struct d_info *di, int len)
1371 {
1372 const char *name;
1373
1374 name = d_str (di);
1375
1376 if (di->send - name < len)
1377 return NULL;
1378
1379 d_advance (di, len);
1380
1381 /* A Java mangled name may have a trailing '$' if it is a C++
1382 keyword. This '$' is not included in the length count. We just
1383 ignore the '$'. */
1384 if ((di->options & DMGL_JAVA) != 0
1385 && d_peek_char (di) == '$')
1386 d_advance (di, 1);
1387
1388 /* Look for something which looks like a gcc encoding of an
1389 anonymous namespace, and replace it with a more user friendly
1390 name. */
1391 if (len >= (int) ANONYMOUS_NAMESPACE_PREFIX_LEN + 2
1392 && memcmp (name, ANONYMOUS_NAMESPACE_PREFIX,
1393 ANONYMOUS_NAMESPACE_PREFIX_LEN) == 0)
1394 {
1395 const char *s;
1396
1397 s = name + ANONYMOUS_NAMESPACE_PREFIX_LEN;
1398 if ((*s == '.' || *s == '_' || *s == '$')
1399 && s[1] == 'N')
1400 {
1401 di->expansion -= len - sizeof "(anonymous namespace)";
1402 return d_make_name (di, "(anonymous namespace)",
1403 sizeof "(anonymous namespace)" - 1);
1404 }
1405 }
1406
1407 return d_make_name (di, name, len);
1408 }
1409
1410 /* operator_name ::= many different two character encodings.
1411 ::= cv <type>
1412 ::= v <digit> <source-name>
1413 */
1414
1415 #define NL(s) s, (sizeof s) - 1
1416
1417 CP_STATIC_IF_GLIBCPP_V3
1418 const struct demangle_operator_info cplus_demangle_operators[] =
1419 {
1420 { "aN", NL ("&="), 2 },
1421 { "aS", NL ("="), 2 },
1422 { "aa", NL ("&&"), 2 },
1423 { "ad", NL ("&"), 1 },
1424 { "an", NL ("&"), 2 },
1425 { "cl", NL ("()"), 0 },
1426 { "cm", NL (","), 2 },
1427 { "co", NL ("~"), 1 },
1428 { "dV", NL ("/="), 2 },
1429 { "da", NL ("delete[]"), 1 },
1430 { "de", NL ("*"), 1 },
1431 { "dl", NL ("delete"), 1 },
1432 { "dv", NL ("/"), 2 },
1433 { "eO", NL ("^="), 2 },
1434 { "eo", NL ("^"), 2 },
1435 { "eq", NL ("=="), 2 },
1436 { "ge", NL (">="), 2 },
1437 { "gt", NL (">"), 2 },
1438 { "ix", NL ("[]"), 2 },
1439 { "lS", NL ("<<="), 2 },
1440 { "le", NL ("<="), 2 },
1441 { "ls", NL ("<<"), 2 },
1442 { "lt", NL ("<"), 2 },
1443 { "mI", NL ("-="), 2 },
1444 { "mL", NL ("*="), 2 },
1445 { "mi", NL ("-"), 2 },
1446 { "ml", NL ("*"), 2 },
1447 { "mm", NL ("--"), 1 },
1448 { "na", NL ("new[]"), 1 },
1449 { "ne", NL ("!="), 2 },
1450 { "ng", NL ("-"), 1 },
1451 { "nt", NL ("!"), 1 },
1452 { "nw", NL ("new"), 1 },
1453 { "oR", NL ("|="), 2 },
1454 { "oo", NL ("||"), 2 },
1455 { "or", NL ("|"), 2 },
1456 { "pL", NL ("+="), 2 },
1457 { "pl", NL ("+"), 2 },
1458 { "pm", NL ("->*"), 2 },
1459 { "pp", NL ("++"), 1 },
1460 { "ps", NL ("+"), 1 },
1461 { "pt", NL ("->"), 2 },
1462 { "qu", NL ("?"), 3 },
1463 { "rM", NL ("%="), 2 },
1464 { "rS", NL (">>="), 2 },
1465 { "rm", NL ("%"), 2 },
1466 { "rs", NL (">>"), 2 },
1467 { "st", NL ("sizeof "), 1 },
1468 { "sz", NL ("sizeof "), 1 },
1469 { NULL, NULL, 0, 0 }
1470 };
1471
1472 static struct demangle_component *
1473 d_operator_name (struct d_info *di)
1474 {
1475 char c1;
1476 char c2;
1477
1478 c1 = d_next_char (di);
1479 c2 = d_next_char (di);
1480 if (c1 == 'v' && IS_DIGIT (c2))
1481 return d_make_extended_operator (di, c2 - '0', d_source_name (di));
1482 else if (c1 == 'c' && c2 == 'v')
1483 return d_make_comp (di, DEMANGLE_COMPONENT_CAST,
1484 cplus_demangle_type (di), NULL);
1485 else
1486 {
1487 /* LOW is the inclusive lower bound. */
1488 int low = 0;
1489 /* HIGH is the exclusive upper bound. We subtract one to ignore
1490 the sentinel at the end of the array. */
1491 int high = ((sizeof (cplus_demangle_operators)
1492 / sizeof (cplus_demangle_operators[0]))
1493 - 1);
1494
1495 while (1)
1496 {
1497 int i;
1498 const struct demangle_operator_info *p;
1499
1500 i = low + (high - low) / 2;
1501 p = cplus_demangle_operators + i;
1502
1503 if (c1 == p->code[0] && c2 == p->code[1])
1504 return d_make_operator (di, p);
1505
1506 if (c1 < p->code[0] || (c1 == p->code[0] && c2 < p->code[1]))
1507 high = i;
1508 else
1509 low = i + 1;
1510 if (low == high)
1511 return NULL;
1512 }
1513 }
1514 }
1515
1516 static struct demangle_component *
1517 d_make_character (struct d_info *di, int c)
1518 {
1519 struct demangle_component *p;
1520 p = d_make_empty (di);
1521 if (p != NULL)
1522 {
1523 p->type = DEMANGLE_COMPONENT_CHARACTER;
1524 p->u.s_character.character = c;
1525 }
1526 return p;
1527 }
1528
1529 static struct demangle_component *
1530 d_java_resource (struct d_info *di)
1531 {
1532 struct demangle_component *p = NULL;
1533 struct demangle_component *next = NULL;
1534 long len, i;
1535 char c;
1536 const char *str;
1537
1538 len = d_number (di);
1539 if (len <= 1)
1540 return NULL;
1541
1542 /* Eat the leading '_'. */
1543 if (d_next_char (di) != '_')
1544 return NULL;
1545 len--;
1546
1547 str = d_str (di);
1548 i = 0;
1549
1550 while (len > 0)
1551 {
1552 c = str[i];
1553 if (!c)
1554 return NULL;
1555
1556 /* Each chunk is either a '$' escape... */
1557 if (c == '$')
1558 {
1559 i++;
1560 switch (str[i++])
1561 {
1562 case 'S':
1563 c = '/';
1564 break;
1565 case '_':
1566 c = '.';
1567 break;
1568 case '$':
1569 c = '$';
1570 break;
1571 default:
1572 return NULL;
1573 }
1574 next = d_make_character (di, c);
1575 d_advance (di, i);
1576 str = d_str (di);
1577 len -= i;
1578 i = 0;
1579 if (next == NULL)
1580 return NULL;
1581 }
1582 /* ... or a sequence of characters. */
1583 else
1584 {
1585 while (i < len && str[i] && str[i] != '$')
1586 i++;
1587
1588 next = d_make_name (di, str, i);
1589 d_advance (di, i);
1590 str = d_str (di);
1591 len -= i;
1592 i = 0;
1593 if (next == NULL)
1594 return NULL;
1595 }
1596
1597 if (p == NULL)
1598 p = next;
1599 else
1600 {
1601 p = d_make_comp (di, DEMANGLE_COMPONENT_COMPOUND_NAME, p, next);
1602 if (p == NULL)
1603 return NULL;
1604 }
1605 }
1606
1607 p = d_make_comp (di, DEMANGLE_COMPONENT_JAVA_RESOURCE, p, NULL);
1608
1609 return p;
1610 }
1611
1612 /* <special-name> ::= TV <type>
1613 ::= TT <type>
1614 ::= TI <type>
1615 ::= TS <type>
1616 ::= GV <(object) name>
1617 ::= T <call-offset> <(base) encoding>
1618 ::= Tc <call-offset> <call-offset> <(base) encoding>
1619 Also g++ extensions:
1620 ::= TC <type> <(offset) number> _ <(base) type>
1621 ::= TF <type>
1622 ::= TJ <type>
1623 ::= GR <name>
1624 ::= GA <encoding>
1625 ::= Gr <resource name>
1626 */
1627
1628 static struct demangle_component *
1629 d_special_name (struct d_info *di)
1630 {
1631 di->expansion += 20;
1632 if (d_check_char (di, 'T'))
1633 {
1634 switch (d_next_char (di))
1635 {
1636 case 'V':
1637 di->expansion -= 5;
1638 return d_make_comp (di, DEMANGLE_COMPONENT_VTABLE,
1639 cplus_demangle_type (di), NULL);
1640 case 'T':
1641 di->expansion -= 10;
1642 return d_make_comp (di, DEMANGLE_COMPONENT_VTT,
1643 cplus_demangle_type (di), NULL);
1644 case 'I':
1645 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO,
1646 cplus_demangle_type (di), NULL);
1647 case 'S':
1648 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_NAME,
1649 cplus_demangle_type (di), NULL);
1650
1651 case 'h':
1652 if (! d_call_offset (di, 'h'))
1653 return NULL;
1654 return d_make_comp (di, DEMANGLE_COMPONENT_THUNK,
1655 d_encoding (di, 0), NULL);
1656
1657 case 'v':
1658 if (! d_call_offset (di, 'v'))
1659 return NULL;
1660 return d_make_comp (di, DEMANGLE_COMPONENT_VIRTUAL_THUNK,
1661 d_encoding (di, 0), NULL);
1662
1663 case 'c':
1664 if (! d_call_offset (di, '\0'))
1665 return NULL;
1666 if (! d_call_offset (di, '\0'))
1667 return NULL;
1668 return d_make_comp (di, DEMANGLE_COMPONENT_COVARIANT_THUNK,
1669 d_encoding (di, 0), NULL);
1670
1671 case 'C':
1672 {
1673 struct demangle_component *derived_type;
1674 long offset;
1675 struct demangle_component *base_type;
1676
1677 derived_type = cplus_demangle_type (di);
1678 offset = d_number (di);
1679 if (offset < 0)
1680 return NULL;
1681 if (! d_check_char (di, '_'))
1682 return NULL;
1683 base_type = cplus_demangle_type (di);
1684 /* We don't display the offset. FIXME: We should display
1685 it in verbose mode. */
1686 di->expansion += 5;
1687 return d_make_comp (di, DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE,
1688 base_type, derived_type);
1689 }
1690
1691 case 'F':
1692 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_FN,
1693 cplus_demangle_type (di), NULL);
1694 case 'J':
1695 return d_make_comp (di, DEMANGLE_COMPONENT_JAVA_CLASS,
1696 cplus_demangle_type (di), NULL);
1697
1698 default:
1699 return NULL;
1700 }
1701 }
1702 else if (d_check_char (di, 'G'))
1703 {
1704 switch (d_next_char (di))
1705 {
1706 case 'V':
1707 return d_make_comp (di, DEMANGLE_COMPONENT_GUARD, d_name (di), NULL);
1708
1709 case 'R':
1710 return d_make_comp (di, DEMANGLE_COMPONENT_REFTEMP, d_name (di),
1711 NULL);
1712
1713 case 'A':
1714 return d_make_comp (di, DEMANGLE_COMPONENT_HIDDEN_ALIAS,
1715 d_encoding (di, 0), NULL);
1716
1717 case 'r':
1718 return d_java_resource (di);
1719
1720 default:
1721 return NULL;
1722 }
1723 }
1724 else
1725 return NULL;
1726 }
1727
1728 /* <call-offset> ::= h <nv-offset> _
1729 ::= v <v-offset> _
1730
1731 <nv-offset> ::= <(offset) number>
1732
1733 <v-offset> ::= <(offset) number> _ <(virtual offset) number>
1734
1735 The C parameter, if not '\0', is a character we just read which is
1736 the start of the <call-offset>.
1737
1738 We don't display the offset information anywhere. FIXME: We should
1739 display it in verbose mode. */
1740
1741 static int
1742 d_call_offset (struct d_info *di, int c)
1743 {
1744 if (c == '\0')
1745 c = d_next_char (di);
1746
1747 if (c == 'h')
1748 d_number (di);
1749 else if (c == 'v')
1750 {
1751 d_number (di);
1752 if (! d_check_char (di, '_'))
1753 return 0;
1754 d_number (di);
1755 }
1756 else
1757 return 0;
1758
1759 if (! d_check_char (di, '_'))
1760 return 0;
1761
1762 return 1;
1763 }
1764
1765 /* <ctor-dtor-name> ::= C1
1766 ::= C2
1767 ::= C3
1768 ::= D0
1769 ::= D1
1770 ::= D2
1771 */
1772
1773 static struct demangle_component *
1774 d_ctor_dtor_name (struct d_info *di)
1775 {
1776 if (di->last_name != NULL)
1777 {
1778 if (di->last_name->type == DEMANGLE_COMPONENT_NAME)
1779 di->expansion += di->last_name->u.s_name.len;
1780 else if (di->last_name->type == DEMANGLE_COMPONENT_SUB_STD)
1781 di->expansion += di->last_name->u.s_string.len;
1782 }
1783 switch (d_peek_char (di))
1784 {
1785 case 'C':
1786 {
1787 enum gnu_v3_ctor_kinds kind;
1788
1789 switch (d_peek_next_char (di))
1790 {
1791 case '1':
1792 kind = gnu_v3_complete_object_ctor;
1793 break;
1794 case '2':
1795 kind = gnu_v3_base_object_ctor;
1796 break;
1797 case '3':
1798 kind = gnu_v3_complete_object_allocating_ctor;
1799 break;
1800 default:
1801 return NULL;
1802 }
1803 d_advance (di, 2);
1804 return d_make_ctor (di, kind, di->last_name);
1805 }
1806
1807 case 'D':
1808 {
1809 enum gnu_v3_dtor_kinds kind;
1810
1811 switch (d_peek_next_char (di))
1812 {
1813 case '0':
1814 kind = gnu_v3_deleting_dtor;
1815 break;
1816 case '1':
1817 kind = gnu_v3_complete_object_dtor;
1818 break;
1819 case '2':
1820 kind = gnu_v3_base_object_dtor;
1821 break;
1822 default:
1823 return NULL;
1824 }
1825 d_advance (di, 2);
1826 return d_make_dtor (di, kind, di->last_name);
1827 }
1828
1829 default:
1830 return NULL;
1831 }
1832 }
1833
1834 /* <type> ::= <builtin-type>
1835 ::= <function-type>
1836 ::= <class-enum-type>
1837 ::= <array-type>
1838 ::= <pointer-to-member-type>
1839 ::= <template-param>
1840 ::= <template-template-param> <template-args>
1841 ::= <substitution>
1842 ::= <CV-qualifiers> <type>
1843 ::= P <type>
1844 ::= R <type>
1845 ::= O <type> (C++0x)
1846 ::= C <type>
1847 ::= G <type>
1848 ::= U <source-name> <type>
1849
1850 <builtin-type> ::= various one letter codes
1851 ::= u <source-name>
1852 */
1853
1854 CP_STATIC_IF_GLIBCPP_V3
1855 const struct demangle_builtin_type_info
1856 cplus_demangle_builtin_types[D_BUILTIN_TYPE_COUNT] =
1857 {
1858 /* a */ { NL ("signed char"), NL ("signed char"), D_PRINT_DEFAULT },
1859 /* b */ { NL ("bool"), NL ("boolean"), D_PRINT_BOOL },
1860 /* c */ { NL ("char"), NL ("byte"), D_PRINT_DEFAULT },
1861 /* d */ { NL ("double"), NL ("double"), D_PRINT_FLOAT },
1862 /* e */ { NL ("long double"), NL ("long double"), D_PRINT_FLOAT },
1863 /* f */ { NL ("float"), NL ("float"), D_PRINT_FLOAT },
1864 /* g */ { NL ("__float128"), NL ("__float128"), D_PRINT_FLOAT },
1865 /* h */ { NL ("unsigned char"), NL ("unsigned char"), D_PRINT_DEFAULT },
1866 /* i */ { NL ("int"), NL ("int"), D_PRINT_INT },
1867 /* j */ { NL ("unsigned int"), NL ("unsigned"), D_PRINT_UNSIGNED },
1868 /* k */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
1869 /* l */ { NL ("long"), NL ("long"), D_PRINT_LONG },
1870 /* m */ { NL ("unsigned long"), NL ("unsigned long"), D_PRINT_UNSIGNED_LONG },
1871 /* n */ { NL ("__int128"), NL ("__int128"), D_PRINT_DEFAULT },
1872 /* o */ { NL ("unsigned __int128"), NL ("unsigned __int128"),
1873 D_PRINT_DEFAULT },
1874 /* p */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
1875 /* q */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
1876 /* r */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
1877 /* s */ { NL ("short"), NL ("short"), D_PRINT_DEFAULT },
1878 /* t */ { NL ("unsigned short"), NL ("unsigned short"), D_PRINT_DEFAULT },
1879 /* u */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
1880 /* v */ { NL ("void"), NL ("void"), D_PRINT_VOID },
1881 /* w */ { NL ("wchar_t"), NL ("char"), D_PRINT_DEFAULT },
1882 /* x */ { NL ("long long"), NL ("long"), D_PRINT_LONG_LONG },
1883 /* y */ { NL ("unsigned long long"), NL ("unsigned long long"),
1884 D_PRINT_UNSIGNED_LONG_LONG },
1885 /* z */ { NL ("..."), NL ("..."), D_PRINT_DEFAULT },
1886 };
1887
1888 CP_STATIC_IF_GLIBCPP_V3
1889 struct demangle_component *
1890 cplus_demangle_type (struct d_info *di)
1891 {
1892 char peek;
1893 struct demangle_component *ret;
1894 int can_subst;
1895
1896 /* The ABI specifies that when CV-qualifiers are used, the base type
1897 is substitutable, and the fully qualified type is substitutable,
1898 but the base type with a strict subset of the CV-qualifiers is
1899 not substitutable. The natural recursive implementation of the
1900 CV-qualifiers would cause subsets to be substitutable, so instead
1901 we pull them all off now.
1902
1903 FIXME: The ABI says that order-insensitive vendor qualifiers
1904 should be handled in the same way, but we have no way to tell
1905 which vendor qualifiers are order-insensitive and which are
1906 order-sensitive. So we just assume that they are all
1907 order-sensitive. g++ 3.4 supports only one vendor qualifier,
1908 __vector, and it treats it as order-sensitive when mangling
1909 names. */
1910
1911 peek = d_peek_char (di);
1912 if (peek == 'r' || peek == 'V' || peek == 'K')
1913 {
1914 struct demangle_component **pret;
1915
1916 pret = d_cv_qualifiers (di, &ret, 0);
1917 if (pret == NULL)
1918 return NULL;
1919 *pret = cplus_demangle_type (di);
1920 if (! *pret || ! d_add_substitution (di, ret))
1921 return NULL;
1922 return ret;
1923 }
1924
1925 can_subst = 1;
1926
1927 switch (peek)
1928 {
1929 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
1930 case 'h': case 'i': case 'j': case 'l': case 'm': case 'n':
1931 case 'o': case 's': case 't':
1932 case 'v': case 'w': case 'x': case 'y': case 'z':
1933 ret = d_make_builtin_type (di,
1934 &cplus_demangle_builtin_types[peek - 'a']);
1935 di->expansion += ret->u.s_builtin.type->len;
1936 can_subst = 0;
1937 d_advance (di, 1);
1938 break;
1939
1940 case 'u':
1941 d_advance (di, 1);
1942 ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE,
1943 d_source_name (di), NULL);
1944 break;
1945
1946 case 'F':
1947 ret = d_function_type (di);
1948 break;
1949
1950 case '0': case '1': case '2': case '3': case '4':
1951 case '5': case '6': case '7': case '8': case '9':
1952 case 'N':
1953 case 'Z':
1954 ret = d_class_enum_type (di);
1955 break;
1956
1957 case 'A':
1958 ret = d_array_type (di);
1959 break;
1960
1961 case 'M':
1962 ret = d_pointer_to_member_type (di);
1963 break;
1964
1965 case 'T':
1966 ret = d_template_param (di);
1967 if (d_peek_char (di) == 'I')
1968 {
1969 /* This is <template-template-param> <template-args>. The
1970 <template-template-param> part is a substitution
1971 candidate. */
1972 if (! d_add_substitution (di, ret))
1973 return NULL;
1974 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
1975 d_template_args (di));
1976 }
1977 break;
1978
1979 case 'S':
1980 /* If this is a special substitution, then it is the start of
1981 <class-enum-type>. */
1982 {
1983 char peek_next;
1984
1985 peek_next = d_peek_next_char (di);
1986 if (IS_DIGIT (peek_next)
1987 || peek_next == '_'
1988 || IS_UPPER (peek_next))
1989 {
1990 ret = d_substitution (di, 0);
1991 /* The substituted name may have been a template name and
1992 may be followed by tepmlate args. */
1993 if (d_peek_char (di) == 'I')
1994 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
1995 d_template_args (di));
1996 else
1997 can_subst = 0;
1998 }
1999 else
2000 {
2001 ret = d_class_enum_type (di);
2002 /* If the substitution was a complete type, then it is not
2003 a new substitution candidate. However, if the
2004 substitution was followed by template arguments, then
2005 the whole thing is a substitution candidate. */
2006 if (ret != NULL && ret->type == DEMANGLE_COMPONENT_SUB_STD)
2007 can_subst = 0;
2008 }
2009 }
2010 break;
2011
2012 case 'O':
2013 d_advance (di, 1);
2014 ret = d_make_comp (di, DEMANGLE_COMPONENT_RVALUE_REFERENCE,
2015 cplus_demangle_type (di), NULL);
2016 break;
2017
2018 case 'P':
2019 d_advance (di, 1);
2020 ret = d_make_comp (di, DEMANGLE_COMPONENT_POINTER,
2021 cplus_demangle_type (di), NULL);
2022 break;
2023
2024 case 'R':
2025 d_advance (di, 1);
2026 ret = d_make_comp (di, DEMANGLE_COMPONENT_REFERENCE,
2027 cplus_demangle_type (di), NULL);
2028 break;
2029
2030 case 'C':
2031 d_advance (di, 1);
2032 ret = d_make_comp (di, DEMANGLE_COMPONENT_COMPLEX,
2033 cplus_demangle_type (di), NULL);
2034 break;
2035
2036 case 'G':
2037 d_advance (di, 1);
2038 ret = d_make_comp (di, DEMANGLE_COMPONENT_IMAGINARY,
2039 cplus_demangle_type (di), NULL);
2040 break;
2041
2042 case 'U':
2043 d_advance (di, 1);
2044 ret = d_source_name (di);
2045 ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL,
2046 cplus_demangle_type (di), ret);
2047 break;
2048
2049 default:
2050 return NULL;
2051 }
2052
2053 if (can_subst)
2054 {
2055 if (! d_add_substitution (di, ret))
2056 return NULL;
2057 }
2058
2059 return ret;
2060 }
2061
2062 /* <CV-qualifiers> ::= [r] [V] [K] */
2063
2064 static struct demangle_component **
2065 d_cv_qualifiers (struct d_info *di,
2066 struct demangle_component **pret, int member_fn)
2067 {
2068 char peek;
2069
2070 peek = d_peek_char (di);
2071 while (peek == 'r' || peek == 'V' || peek == 'K')
2072 {
2073 enum demangle_component_type t;
2074
2075 d_advance (di, 1);
2076 if (peek == 'r')
2077 {
2078 t = (member_fn
2079 ? DEMANGLE_COMPONENT_RESTRICT_THIS
2080 : DEMANGLE_COMPONENT_RESTRICT);
2081 di->expansion += sizeof "restrict";
2082 }
2083 else if (peek == 'V')
2084 {
2085 t = (member_fn
2086 ? DEMANGLE_COMPONENT_VOLATILE_THIS
2087 : DEMANGLE_COMPONENT_VOLATILE);
2088 di->expansion += sizeof "volatile";
2089 }
2090 else
2091 {
2092 t = (member_fn
2093 ? DEMANGLE_COMPONENT_CONST_THIS
2094 : DEMANGLE_COMPONENT_CONST);
2095 di->expansion += sizeof "const";
2096 }
2097
2098 *pret = d_make_comp (di, t, NULL, NULL);
2099 if (*pret == NULL)
2100 return NULL;
2101 pret = &d_left (*pret);
2102
2103 peek = d_peek_char (di);
2104 }
2105
2106 return pret;
2107 }
2108
2109 /* <function-type> ::= F [Y] <bare-function-type> E */
2110
2111 static struct demangle_component *
2112 d_function_type (struct d_info *di)
2113 {
2114 struct demangle_component *ret;
2115
2116 if (! d_check_char (di, 'F'))
2117 return NULL;
2118 if (d_peek_char (di) == 'Y')
2119 {
2120 /* Function has C linkage. We don't print this information.
2121 FIXME: We should print it in verbose mode. */
2122 d_advance (di, 1);
2123 }
2124 ret = d_bare_function_type (di, 1);
2125 if (! d_check_char (di, 'E'))
2126 return NULL;
2127 return ret;
2128 }
2129
2130 /* <bare-function-type> ::= [J]<type>+ */
2131
2132 static struct demangle_component *
2133 d_bare_function_type (struct d_info *di, int has_return_type)
2134 {
2135 struct demangle_component *return_type;
2136 struct demangle_component *tl;
2137 struct demangle_component **ptl;
2138 char peek;
2139
2140 /* Detect special qualifier indicating that the first argument
2141 is the return type. */
2142 peek = d_peek_char (di);
2143 if (peek == 'J')
2144 {
2145 d_advance (di, 1);
2146 has_return_type = 1;
2147 }
2148
2149 return_type = NULL;
2150 tl = NULL;
2151 ptl = &tl;
2152 while (1)
2153 {
2154 struct demangle_component *type;
2155
2156 peek = d_peek_char (di);
2157 if (peek == '\0' || peek == 'E')
2158 break;
2159 type = cplus_demangle_type (di);
2160 if (type == NULL)
2161 return NULL;
2162 if (has_return_type)
2163 {
2164 return_type = type;
2165 has_return_type = 0;
2166 }
2167 else
2168 {
2169 *ptl = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, type, NULL);
2170 if (*ptl == NULL)
2171 return NULL;
2172 ptl = &d_right (*ptl);
2173 }
2174 }
2175
2176 /* There should be at least one parameter type besides the optional
2177 return type. A function which takes no arguments will have a
2178 single parameter type void. */
2179 if (tl == NULL)
2180 return NULL;
2181
2182 /* If we have a single parameter type void, omit it. */
2183 if (d_right (tl) == NULL
2184 && d_left (tl)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
2185 && d_left (tl)->u.s_builtin.type->print == D_PRINT_VOID)
2186 {
2187 di->expansion -= d_left (tl)->u.s_builtin.type->len;
2188 tl = NULL;
2189 }
2190
2191 return d_make_comp (di, DEMANGLE_COMPONENT_FUNCTION_TYPE, return_type, tl);
2192 }
2193
2194 /* <class-enum-type> ::= <name> */
2195
2196 static struct demangle_component *
2197 d_class_enum_type (struct d_info *di)
2198 {
2199 return d_name (di);
2200 }
2201
2202 /* <array-type> ::= A <(positive dimension) number> _ <(element) type>
2203 ::= A [<(dimension) expression>] _ <(element) type>
2204 */
2205
2206 static struct demangle_component *
2207 d_array_type (struct d_info *di)
2208 {
2209 char peek;
2210 struct demangle_component *dim;
2211
2212 if (! d_check_char (di, 'A'))
2213 return NULL;
2214
2215 peek = d_peek_char (di);
2216 if (peek == '_')
2217 dim = NULL;
2218 else if (IS_DIGIT (peek))
2219 {
2220 const char *s;
2221
2222 s = d_str (di);
2223 do
2224 {
2225 d_advance (di, 1);
2226 peek = d_peek_char (di);
2227 }
2228 while (IS_DIGIT (peek));
2229 dim = d_make_name (di, s, d_str (di) - s);
2230 if (dim == NULL)
2231 return NULL;
2232 }
2233 else
2234 {
2235 dim = d_expression (di);
2236 if (dim == NULL)
2237 return NULL;
2238 }
2239
2240 if (! d_check_char (di, '_'))
2241 return NULL;
2242
2243 return d_make_comp (di, DEMANGLE_COMPONENT_ARRAY_TYPE, dim,
2244 cplus_demangle_type (di));
2245 }
2246
2247 /* <pointer-to-member-type> ::= M <(class) type> <(member) type> */
2248
2249 static struct demangle_component *
2250 d_pointer_to_member_type (struct d_info *di)
2251 {
2252 struct demangle_component *cl;
2253 struct demangle_component *mem;
2254 struct demangle_component **pmem;
2255
2256 if (! d_check_char (di, 'M'))
2257 return NULL;
2258
2259 cl = cplus_demangle_type (di);
2260
2261 /* The ABI specifies that any type can be a substitution source, and
2262 that M is followed by two types, and that when a CV-qualified
2263 type is seen both the base type and the CV-qualified types are
2264 substitution sources. The ABI also specifies that for a pointer
2265 to a CV-qualified member function, the qualifiers are attached to
2266 the second type. Given the grammar, a plain reading of the ABI
2267 suggests that both the CV-qualified member function and the
2268 non-qualified member function are substitution sources. However,
2269 g++ does not work that way. g++ treats only the CV-qualified
2270 member function as a substitution source. FIXME. So to work
2271 with g++, we need to pull off the CV-qualifiers here, in order to
2272 avoid calling add_substitution() in cplus_demangle_type(). But
2273 for a CV-qualified member which is not a function, g++ does
2274 follow the ABI, so we need to handle that case here by calling
2275 d_add_substitution ourselves. */
2276
2277 pmem = d_cv_qualifiers (di, &mem, 1);
2278 if (pmem == NULL)
2279 return NULL;
2280 *pmem = cplus_demangle_type (di);
2281 if (*pmem == NULL)
2282 return NULL;
2283
2284 if (pmem != &mem && (*pmem)->type != DEMANGLE_COMPONENT_FUNCTION_TYPE)
2285 {
2286 if (! d_add_substitution (di, mem))
2287 return NULL;
2288 }
2289
2290 return d_make_comp (di, DEMANGLE_COMPONENT_PTRMEM_TYPE, cl, mem);
2291 }
2292
2293 /* <template-param> ::= T_
2294 ::= T <(parameter-2 non-negative) number> _
2295 */
2296
2297 static struct demangle_component *
2298 d_template_param (struct d_info *di)
2299 {
2300 long param;
2301
2302 if (! d_check_char (di, 'T'))
2303 return NULL;
2304
2305 if (d_peek_char (di) == '_')
2306 param = 0;
2307 else
2308 {
2309 param = d_number (di);
2310 if (param < 0)
2311 return NULL;
2312 param += 1;
2313 }
2314
2315 if (! d_check_char (di, '_'))
2316 return NULL;
2317
2318 ++di->did_subs;
2319
2320 return d_make_template_param (di, param);
2321 }
2322
2323 /* <template-args> ::= I <template-arg>+ E */
2324
2325 static struct demangle_component *
2326 d_template_args (struct d_info *di)
2327 {
2328 struct demangle_component *hold_last_name;
2329 struct demangle_component *al;
2330 struct demangle_component **pal;
2331
2332 /* Preserve the last name we saw--don't let the template arguments
2333 clobber it, as that would give us the wrong name for a subsequent
2334 constructor or destructor. */
2335 hold_last_name = di->last_name;
2336
2337 if (! d_check_char (di, 'I'))
2338 return NULL;
2339
2340 al = NULL;
2341 pal = &al;
2342 while (1)
2343 {
2344 struct demangle_component *a;
2345
2346 a = d_template_arg (di);
2347 if (a == NULL)
2348 return NULL;
2349
2350 *pal = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, a, NULL);
2351 if (*pal == NULL)
2352 return NULL;
2353 pal = &d_right (*pal);
2354
2355 if (d_peek_char (di) == 'E')
2356 {
2357 d_advance (di, 1);
2358 break;
2359 }
2360 }
2361
2362 di->last_name = hold_last_name;
2363
2364 return al;
2365 }
2366
2367 /* <template-arg> ::= <type>
2368 ::= X <expression> E
2369 ::= <expr-primary>
2370 */
2371
2372 static struct demangle_component *
2373 d_template_arg (struct d_info *di)
2374 {
2375 struct demangle_component *ret;
2376
2377 switch (d_peek_char (di))
2378 {
2379 case 'X':
2380 d_advance (di, 1);
2381 ret = d_expression (di);
2382 if (! d_check_char (di, 'E'))
2383 return NULL;
2384 return ret;
2385
2386 case 'L':
2387 return d_expr_primary (di);
2388
2389 default:
2390 return cplus_demangle_type (di);
2391 }
2392 }
2393
2394 /* <expression> ::= <(unary) operator-name> <expression>
2395 ::= <(binary) operator-name> <expression> <expression>
2396 ::= <(trinary) operator-name> <expression> <expression> <expression>
2397 ::= st <type>
2398 ::= <template-param>
2399 ::= sr <type> <unqualified-name>
2400 ::= sr <type> <unqualified-name> <template-args>
2401 ::= <expr-primary>
2402 */
2403
2404 static struct demangle_component *
2405 d_expression (struct d_info *di)
2406 {
2407 char peek;
2408
2409 peek = d_peek_char (di);
2410 if (peek == 'L')
2411 return d_expr_primary (di);
2412 else if (peek == 'T')
2413 return d_template_param (di);
2414 else if (peek == 's' && d_peek_next_char (di) == 'r')
2415 {
2416 struct demangle_component *type;
2417 struct demangle_component *name;
2418
2419 d_advance (di, 2);
2420 type = cplus_demangle_type (di);
2421 name = d_unqualified_name (di);
2422 if (d_peek_char (di) != 'I')
2423 return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type, name);
2424 else
2425 return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type,
2426 d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
2427 d_template_args (di)));
2428 }
2429 else
2430 {
2431 struct demangle_component *op;
2432 int args;
2433
2434 op = d_operator_name (di);
2435 if (op == NULL)
2436 return NULL;
2437
2438 if (op->type == DEMANGLE_COMPONENT_OPERATOR)
2439 di->expansion += op->u.s_operator.op->len - 2;
2440
2441 if (op->type == DEMANGLE_COMPONENT_OPERATOR
2442 && strcmp (op->u.s_operator.op->code, "st") == 0)
2443 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
2444 cplus_demangle_type (di));
2445
2446 switch (op->type)
2447 {
2448 default:
2449 return NULL;
2450 case DEMANGLE_COMPONENT_OPERATOR:
2451 args = op->u.s_operator.op->args;
2452 break;
2453 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
2454 args = op->u.s_extended_operator.args;
2455 break;
2456 case DEMANGLE_COMPONENT_CAST:
2457 args = 1;
2458 break;
2459 }
2460
2461 switch (args)
2462 {
2463 case 1:
2464 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
2465 d_expression (di));
2466 case 2:
2467 {
2468 struct demangle_component *left;
2469
2470 left = d_expression (di);
2471 return d_make_comp (di, DEMANGLE_COMPONENT_BINARY, op,
2472 d_make_comp (di,
2473 DEMANGLE_COMPONENT_BINARY_ARGS,
2474 left,
2475 d_expression (di)));
2476 }
2477 case 3:
2478 {
2479 struct demangle_component *first;
2480 struct demangle_component *second;
2481
2482 first = d_expression (di);
2483 second = d_expression (di);
2484 return d_make_comp (di, DEMANGLE_COMPONENT_TRINARY, op,
2485 d_make_comp (di,
2486 DEMANGLE_COMPONENT_TRINARY_ARG1,
2487 first,
2488 d_make_comp (di,
2489 DEMANGLE_COMPONENT_TRINARY_ARG2,
2490 second,
2491 d_expression (di))));
2492 }
2493 default:
2494 return NULL;
2495 }
2496 }
2497 }
2498
2499 /* <expr-primary> ::= L <type> <(value) number> E
2500 ::= L <type> <(value) float> E
2501 ::= L <mangled-name> E
2502 */
2503
2504 static struct demangle_component *
2505 d_expr_primary (struct d_info *di)
2506 {
2507 struct demangle_component *ret;
2508
2509 if (! d_check_char (di, 'L'))
2510 return NULL;
2511 if (d_peek_char (di) == '_')
2512 ret = cplus_demangle_mangled_name (di, 0);
2513 else
2514 {
2515 struct demangle_component *type;
2516 enum demangle_component_type t;
2517 const char *s;
2518
2519 type = cplus_demangle_type (di);
2520 if (type == NULL)
2521 return NULL;
2522
2523 /* If we have a type we know how to print, we aren't going to
2524 print the type name itself. */
2525 if (type->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
2526 && type->u.s_builtin.type->print != D_PRINT_DEFAULT)
2527 di->expansion -= type->u.s_builtin.type->len;
2528
2529 /* Rather than try to interpret the literal value, we just
2530 collect it as a string. Note that it's possible to have a
2531 floating point literal here. The ABI specifies that the
2532 format of such literals is machine independent. That's fine,
2533 but what's not fine is that versions of g++ up to 3.2 with
2534 -fabi-version=1 used upper case letters in the hex constant,
2535 and dumped out gcc's internal representation. That makes it
2536 hard to tell where the constant ends, and hard to dump the
2537 constant in any readable form anyhow. We don't attempt to
2538 handle these cases. */
2539
2540 t = DEMANGLE_COMPONENT_LITERAL;
2541 if (d_peek_char (di) == 'n')
2542 {
2543 t = DEMANGLE_COMPONENT_LITERAL_NEG;
2544 d_advance (di, 1);
2545 }
2546 s = d_str (di);
2547 while (d_peek_char (di) != 'E')
2548 {
2549 if (d_peek_char (di) == '\0')
2550 return NULL;
2551 d_advance (di, 1);
2552 }
2553 ret = d_make_comp (di, t, type, d_make_name (di, s, d_str (di) - s));
2554 }
2555 if (! d_check_char (di, 'E'))
2556 return NULL;
2557 return ret;
2558 }
2559
2560 /* <local-name> ::= Z <(function) encoding> E <(entity) name> [<discriminator>]
2561 ::= Z <(function) encoding> E s [<discriminator>]
2562 */
2563
2564 static struct demangle_component *
2565 d_local_name (struct d_info *di)
2566 {
2567 struct demangle_component *function;
2568
2569 if (! d_check_char (di, 'Z'))
2570 return NULL;
2571
2572 function = d_encoding (di, 0);
2573
2574 if (! d_check_char (di, 'E'))
2575 return NULL;
2576
2577 if (d_peek_char (di) == 's')
2578 {
2579 d_advance (di, 1);
2580 if (! d_discriminator (di))
2581 return NULL;
2582 return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function,
2583 d_make_name (di, "string literal",
2584 sizeof "string literal" - 1));
2585 }
2586 else
2587 {
2588 struct demangle_component *name;
2589
2590 name = d_name (di);
2591 if (! d_discriminator (di))
2592 return NULL;
2593 return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function, name);
2594 }
2595 }
2596
2597 /* <discriminator> ::= _ <(non-negative) number>
2598
2599 We demangle the discriminator, but we don't print it out. FIXME:
2600 We should print it out in verbose mode. */
2601
2602 static int
2603 d_discriminator (struct d_info *di)
2604 {
2605 long discrim;
2606
2607 if (d_peek_char (di) != '_')
2608 return 1;
2609 d_advance (di, 1);
2610 discrim = d_number (di);
2611 if (discrim < 0)
2612 return 0;
2613 return 1;
2614 }
2615
2616 /* Add a new substitution. */
2617
2618 static int
2619 d_add_substitution (struct d_info *di, struct demangle_component *dc)
2620 {
2621 if (dc == NULL)
2622 return 0;
2623 if (di->next_sub >= di->num_subs)
2624 return 0;
2625 di->subs[di->next_sub] = dc;
2626 ++di->next_sub;
2627 return 1;
2628 }
2629
2630 /* <substitution> ::= S <seq-id> _
2631 ::= S_
2632 ::= St
2633 ::= Sa
2634 ::= Sb
2635 ::= Ss
2636 ::= Si
2637 ::= So
2638 ::= Sd
2639
2640 If PREFIX is non-zero, then this type is being used as a prefix in
2641 a qualified name. In this case, for the standard substitutions, we
2642 need to check whether we are being used as a prefix for a
2643 constructor or destructor, and return a full template name.
2644 Otherwise we will get something like std::iostream::~iostream()
2645 which does not correspond particularly well to any function which
2646 actually appears in the source.
2647 */
2648
2649 static const struct d_standard_sub_info standard_subs[] =
2650 {
2651 { 't', NL ("std"),
2652 NL ("std"),
2653 NULL, 0 },
2654 { 'a', NL ("std::allocator"),
2655 NL ("std::allocator"),
2656 NL ("allocator") },
2657 { 'b', NL ("std::basic_string"),
2658 NL ("std::basic_string"),
2659 NL ("basic_string") },
2660 { 's', NL ("std::string"),
2661 NL ("std::basic_string<char, std::char_traits<char>, std::allocator<char> >"),
2662 NL ("basic_string") },
2663 { 'i', NL ("std::istream"),
2664 NL ("std::basic_istream<char, std::char_traits<char> >"),
2665 NL ("basic_istream") },
2666 { 'o', NL ("std::ostream"),
2667 NL ("std::basic_ostream<char, std::char_traits<char> >"),
2668 NL ("basic_ostream") },
2669 { 'd', NL ("std::iostream"),
2670 NL ("std::basic_iostream<char, std::char_traits<char> >"),
2671 NL ("basic_iostream") }
2672 };
2673
2674 static struct demangle_component *
2675 d_substitution (struct d_info *di, int prefix)
2676 {
2677 char c;
2678
2679 if (! d_check_char (di, 'S'))
2680 return NULL;
2681
2682 c = d_next_char (di);
2683 if (c == '_' || IS_DIGIT (c) || IS_UPPER (c))
2684 {
2685 unsigned int id;
2686
2687 id = 0;
2688 if (c != '_')
2689 {
2690 do
2691 {
2692 unsigned int new_id;
2693
2694 if (IS_DIGIT (c))
2695 new_id = id * 36 + c - '0';
2696 else if (IS_UPPER (c))
2697 new_id = id * 36 + c - 'A' + 10;
2698 else
2699 return NULL;
2700 if (new_id < id)
2701 return NULL;
2702 id = new_id;
2703 c = d_next_char (di);
2704 }
2705 while (c != '_');
2706
2707 ++id;
2708 }
2709
2710 if (id >= (unsigned int) di->next_sub)
2711 return NULL;
2712
2713 ++di->did_subs;
2714
2715 return di->subs[id];
2716 }
2717 else
2718 {
2719 int verbose;
2720 const struct d_standard_sub_info *p;
2721 const struct d_standard_sub_info *pend;
2722
2723 verbose = (di->options & DMGL_VERBOSE) != 0;
2724 if (! verbose && prefix)
2725 {
2726 char peek;
2727
2728 peek = d_peek_char (di);
2729 if (peek == 'C' || peek == 'D')
2730 verbose = 1;
2731 }
2732
2733 pend = (&standard_subs[0]
2734 + sizeof standard_subs / sizeof standard_subs[0]);
2735 for (p = &standard_subs[0]; p < pend; ++p)
2736 {
2737 if (c == p->code)
2738 {
2739 const char *s;
2740 int len;
2741
2742 if (p->set_last_name != NULL)
2743 di->last_name = d_make_sub (di, p->set_last_name,
2744 p->set_last_name_len);
2745 if (verbose)
2746 {
2747 s = p->full_expansion;
2748 len = p->full_len;
2749 }
2750 else
2751 {
2752 s = p->simple_expansion;
2753 len = p->simple_len;
2754 }
2755 di->expansion += len;
2756 return d_make_sub (di, s, len);
2757 }
2758 }
2759
2760 return NULL;
2761 }
2762 }
2763
2764 /* Initialize a growable string. */
2765
2766 static void
2767 d_growable_string_init (struct d_growable_string *dgs, size_t estimate)
2768 {
2769 dgs->buf = NULL;
2770 dgs->len = 0;
2771 dgs->alc = 0;
2772 dgs->allocation_failure = 0;
2773
2774 if (estimate > 0)
2775 d_growable_string_resize (dgs, estimate);
2776 }
2777
2778 /* Grow a growable string to a given size. */
2779
2780 static inline void
2781 d_growable_string_resize (struct d_growable_string *dgs, size_t need)
2782 {
2783 size_t newalc;
2784 char *newbuf;
2785
2786 if (dgs->allocation_failure)
2787 return;
2788
2789 /* Start allocation at two bytes to avoid any possibility of confusion
2790 with the special value of 1 used as a return in *palc to indicate
2791 allocation failures. */
2792 newalc = dgs->alc > 0 ? dgs->alc : 2;
2793 while (newalc < need)
2794 newalc <<= 1;
2795
2796 newbuf = (char *) realloc (dgs->buf, newalc);
2797 if (newbuf == NULL)
2798 {
2799 free (dgs->buf);
2800 dgs->buf = NULL;
2801 dgs->len = 0;
2802 dgs->alc = 0;
2803 dgs->allocation_failure = 1;
2804 return;
2805 }
2806 dgs->buf = newbuf;
2807 dgs->alc = newalc;
2808 }
2809
2810 /* Append a buffer to a growable string. */
2811
2812 static inline void
2813 d_growable_string_append_buffer (struct d_growable_string *dgs,
2814 const char *s, size_t l)
2815 {
2816 size_t need;
2817
2818 need = dgs->len + l + 1;
2819 if (need > dgs->alc)
2820 d_growable_string_resize (dgs, need);
2821
2822 if (dgs->allocation_failure)
2823 return;
2824
2825 memcpy (dgs->buf + dgs->len, s, l);
2826 dgs->buf[dgs->len + l] = '\0';
2827 dgs->len += l;
2828 }
2829
2830 /* Bridge growable strings to the callback mechanism. */
2831
2832 static void
2833 d_growable_string_callback_adapter (const char *s, size_t l, void *opaque)
2834 {
2835 struct d_growable_string *dgs = (struct d_growable_string*) opaque;
2836
2837 d_growable_string_append_buffer (dgs, s, l);
2838 }
2839
2840 /* Initialize a print information structure. */
2841
2842 static void
2843 d_print_init (struct d_print_info *dpi, int options,
2844 demangle_callbackref callback, void *opaque)
2845 {
2846 dpi->options = options;
2847 dpi->len = 0;
2848 dpi->last_char = '\0';
2849 dpi->templates = NULL;
2850 dpi->modifiers = NULL;
2851
2852 dpi->callback = callback;
2853 dpi->opaque = opaque;
2854
2855 dpi->demangle_failure = 0;
2856 }
2857
2858 /* Indicate that an error occurred during printing, and test for error. */
2859
2860 static inline void
2861 d_print_error (struct d_print_info *dpi)
2862 {
2863 dpi->demangle_failure = 1;
2864 }
2865
2866 static inline int
2867 d_print_saw_error (struct d_print_info *dpi)
2868 {
2869 return dpi->demangle_failure != 0;
2870 }
2871
2872 /* Flush buffered characters to the callback. */
2873
2874 static inline void
2875 d_print_flush (struct d_print_info *dpi)
2876 {
2877 dpi->buf[dpi->len] = '\0';
2878 dpi->callback (dpi->buf, dpi->len, dpi->opaque);
2879 dpi->len = 0;
2880 }
2881
2882 /* Append characters and buffers for printing. */
2883
2884 static inline void
2885 d_append_char (struct d_print_info *dpi, char c)
2886 {
2887 if (dpi->len == sizeof (dpi->buf) - 1)
2888 d_print_flush (dpi);
2889
2890 dpi->buf[dpi->len++] = c;
2891 dpi->last_char = c;
2892 }
2893
2894 static inline void
2895 d_append_buffer (struct d_print_info *dpi, const char *s, size_t l)
2896 {
2897 size_t i;
2898
2899 for (i = 0; i < l; i++)
2900 d_append_char (dpi, s[i]);
2901 }
2902
2903 static inline void
2904 d_append_string (struct d_print_info *dpi, const char *s)
2905 {
2906 d_append_buffer (dpi, s, strlen (s));
2907 }
2908
2909 static inline char
2910 d_last_char (struct d_print_info *dpi)
2911 {
2912 return dpi->last_char;
2913 }
2914
2915 /* Turn components into a human readable string. OPTIONS is the
2916 options bits passed to the demangler. DC is the tree to print.
2917 CALLBACK is a function to call to flush demangled string segments
2918 as they fill the intermediate buffer, and OPAQUE is a generalized
2919 callback argument. On success, this returns 1. On failure,
2920 it returns 0, indicating a bad parse. It does not use heap
2921 memory to build an output string, so cannot encounter memory
2922 allocation failure. */
2923
2924 CP_STATIC_IF_GLIBCPP_V3
2925 int
2926 cplus_demangle_print_callback (int options,
2927 const struct demangle_component *dc,
2928 demangle_callbackref callback, void *opaque)
2929 {
2930 struct d_print_info dpi;
2931
2932 d_print_init (&dpi, options, callback, opaque);
2933
2934 d_print_comp (&dpi, dc);
2935
2936 d_print_flush (&dpi);
2937
2938 return ! d_print_saw_error (&dpi);
2939 }
2940
2941 /* Turn components into a human readable string. OPTIONS is the
2942 options bits passed to the demangler. DC is the tree to print.
2943 ESTIMATE is a guess at the length of the result. This returns a
2944 string allocated by malloc, or NULL on error. On success, this
2945 sets *PALC to the size of the allocated buffer. On failure, this
2946 sets *PALC to 0 for a bad parse, or to 1 for a memory allocation
2947 failure. */
2948
2949 CP_STATIC_IF_GLIBCPP_V3
2950 char *
2951 cplus_demangle_print (int options, const struct demangle_component *dc,
2952 int estimate, size_t *palc)
2953 {
2954 struct d_growable_string dgs;
2955
2956 d_growable_string_init (&dgs, estimate);
2957
2958 if (! cplus_demangle_print_callback (options, dc,
2959 d_growable_string_callback_adapter,
2960 &dgs))
2961 {
2962 free (dgs.buf);
2963 *palc = 0;
2964 return NULL;
2965 }
2966
2967 *palc = dgs.allocation_failure ? 1 : dgs.alc;
2968 return dgs.buf;
2969 }
2970
2971 /* Subroutine to handle components. */
2972
2973 static void
2974 d_print_comp (struct d_print_info *dpi,
2975 const struct demangle_component *dc)
2976 {
2977 if (dc == NULL)
2978 {
2979 d_print_error (dpi);
2980 return;
2981 }
2982 if (d_print_saw_error (dpi))
2983 return;
2984
2985 switch (dc->type)
2986 {
2987 case DEMANGLE_COMPONENT_NAME:
2988 if ((dpi->options & DMGL_JAVA) == 0)
2989 d_append_buffer (dpi, dc->u.s_name.s, dc->u.s_name.len);
2990 else
2991 d_print_java_identifier (dpi, dc->u.s_name.s, dc->u.s_name.len);
2992 return;
2993
2994 case DEMANGLE_COMPONENT_QUAL_NAME:
2995 case DEMANGLE_COMPONENT_LOCAL_NAME:
2996 d_print_comp (dpi, d_left (dc));
2997 if ((dpi->options & DMGL_JAVA) == 0)
2998 d_append_string (dpi, "::");
2999 else
3000 d_append_char (dpi, '.');
3001 d_print_comp (dpi, d_right (dc));
3002 return;
3003
3004 case DEMANGLE_COMPONENT_TYPED_NAME:
3005 {
3006 struct d_print_mod *hold_modifiers;
3007 struct demangle_component *typed_name;
3008 struct d_print_mod adpm[4];
3009 unsigned int i;
3010 struct d_print_template dpt;
3011
3012 /* Pass the name down to the type so that it can be printed in
3013 the right place for the type. We also have to pass down
3014 any CV-qualifiers, which apply to the this parameter. */
3015 hold_modifiers = dpi->modifiers;
3016 i = 0;
3017 typed_name = d_left (dc);
3018 while (typed_name != NULL)
3019 {
3020 if (i >= sizeof adpm / sizeof adpm[0])
3021 {
3022 d_print_error (dpi);
3023 return;
3024 }
3025
3026 adpm[i].next = dpi->modifiers;
3027 dpi->modifiers = &adpm[i];
3028 adpm[i].mod = typed_name;
3029 adpm[i].printed = 0;
3030 adpm[i].templates = dpi->templates;
3031 ++i;
3032
3033 if (typed_name->type != DEMANGLE_COMPONENT_RESTRICT_THIS
3034 && typed_name->type != DEMANGLE_COMPONENT_VOLATILE_THIS
3035 && typed_name->type != DEMANGLE_COMPONENT_CONST_THIS)
3036 break;
3037
3038 typed_name = d_left (typed_name);
3039 }
3040
3041 if (typed_name == NULL)
3042 {
3043 d_print_error (dpi);
3044 return;
3045 }
3046
3047 /* If typed_name is a template, then it applies to the
3048 function type as well. */
3049 if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
3050 {
3051 dpt.next = dpi->templates;
3052 dpi->templates = &dpt;
3053 dpt.template_decl = typed_name;
3054 }
3055
3056 /* If typed_name is a DEMANGLE_COMPONENT_LOCAL_NAME, then
3057 there may be CV-qualifiers on its right argument which
3058 really apply here; this happens when parsing a class which
3059 is local to a function. */
3060 if (typed_name->type == DEMANGLE_COMPONENT_LOCAL_NAME)
3061 {
3062 struct demangle_component *local_name;
3063
3064 local_name = d_right (typed_name);
3065 while (local_name->type == DEMANGLE_COMPONENT_RESTRICT_THIS
3066 || local_name->type == DEMANGLE_COMPONENT_VOLATILE_THIS
3067 || local_name->type == DEMANGLE_COMPONENT_CONST_THIS)
3068 {
3069 if (i >= sizeof adpm / sizeof adpm[0])
3070 {
3071 d_print_error (dpi);
3072 return;
3073 }
3074
3075 adpm[i] = adpm[i - 1];
3076 adpm[i].next = &adpm[i - 1];
3077 dpi->modifiers = &adpm[i];
3078
3079 adpm[i - 1].mod = local_name;
3080 adpm[i - 1].printed = 0;
3081 adpm[i - 1].templates = dpi->templates;
3082 ++i;
3083
3084 local_name = d_left (local_name);
3085 }
3086 }
3087
3088 d_print_comp (dpi, d_right (dc));
3089
3090 if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
3091 dpi->templates = dpt.next;
3092
3093 /* If the modifiers didn't get printed by the type, print them
3094 now. */
3095 while (i > 0)
3096 {
3097 --i;
3098 if (! adpm[i].printed)
3099 {
3100 d_append_char (dpi, ' ');
3101 d_print_mod (dpi, adpm[i].mod);
3102 }
3103 }
3104
3105 dpi->modifiers = hold_modifiers;
3106
3107 return;
3108 }
3109
3110 case DEMANGLE_COMPONENT_TEMPLATE:
3111 {
3112 struct d_print_mod *hold_dpm;
3113 struct demangle_component *dcl;
3114
3115 /* Don't push modifiers into a template definition. Doing so
3116 could give the wrong definition for a template argument.
3117 Instead, treat the template essentially as a name. */
3118
3119 hold_dpm = dpi->modifiers;
3120 dpi->modifiers = NULL;
3121
3122 dcl = d_left (dc);
3123
3124 if ((dpi->options & DMGL_JAVA) != 0
3125 && dcl->type == DEMANGLE_COMPONENT_NAME
3126 && dcl->u.s_name.len == 6
3127 && strncmp (dcl->u.s_name.s, "JArray", 6) == 0)
3128 {
3129 /* Special-case Java arrays, so that JArray<TYPE> appears
3130 instead as TYPE[]. */
3131
3132 d_print_comp (dpi, d_right (dc));
3133 d_append_string (dpi, "[]");
3134 }
3135 else
3136 {
3137 d_print_comp (dpi, dcl);
3138 if (d_last_char (dpi) == '<')
3139 d_append_char (dpi, ' ');
3140 d_append_char (dpi, '<');
3141 d_print_comp (dpi, d_right (dc));
3142 /* Avoid generating two consecutive '>' characters, to avoid
3143 the C++ syntactic ambiguity. */
3144 if (d_last_char (dpi) == '>')
3145 d_append_char (dpi, ' ');
3146 d_append_char (dpi, '>');
3147 }
3148
3149 dpi->modifiers = hold_dpm;
3150
3151 return;
3152 }
3153
3154 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
3155 {
3156 long i;
3157 struct demangle_component *a;
3158 struct d_print_template *hold_dpt;
3159
3160 if (dpi->templates == NULL)
3161 {
3162 d_print_error (dpi);
3163 return;
3164 }
3165 i = dc->u.s_number.number;
3166 for (a = d_right (dpi->templates->template_decl);
3167 a != NULL;
3168 a = d_right (a))
3169 {
3170 if (a->type != DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
3171 {
3172 d_print_error (dpi);
3173 return;
3174 }
3175 if (i <= 0)
3176 break;
3177 --i;
3178 }
3179 if (i != 0 || a == NULL)
3180 {
3181 d_print_error (dpi);
3182 return;
3183 }
3184
3185 /* While processing this parameter, we need to pop the list of
3186 templates. This is because the template parameter may
3187 itself be a reference to a parameter of an outer
3188 template. */
3189
3190 hold_dpt = dpi->templates;
3191 dpi->templates = hold_dpt->next;
3192
3193 d_print_comp (dpi, d_left (a));
3194
3195 dpi->templates = hold_dpt;
3196
3197 return;
3198 }
3199
3200 case DEMANGLE_COMPONENT_CTOR:
3201 d_print_comp (dpi, dc->u.s_ctor.name);
3202 return;
3203
3204 case DEMANGLE_COMPONENT_DTOR:
3205 d_append_char (dpi, '~');
3206 d_print_comp (dpi, dc->u.s_dtor.name);
3207 return;
3208
3209 case DEMANGLE_COMPONENT_VTABLE:
3210 d_append_string (dpi, "vtable for ");
3211 d_print_comp (dpi, d_left (dc));
3212 return;
3213
3214 case DEMANGLE_COMPONENT_VTT:
3215 d_append_string (dpi, "VTT for ");
3216 d_print_comp (dpi, d_left (dc));
3217 return;
3218
3219 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
3220 d_append_string (dpi, "construction vtable for ");
3221 d_print_comp (dpi, d_left (dc));
3222 d_append_string (dpi, "-in-");
3223 d_print_comp (dpi, d_right (dc));
3224 return;
3225
3226 case DEMANGLE_COMPONENT_TYPEINFO:
3227 d_append_string (dpi, "typeinfo for ");
3228 d_print_comp (dpi, d_left (dc));
3229 return;
3230
3231 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
3232 d_append_string (dpi, "typeinfo name for ");
3233 d_print_comp (dpi, d_left (dc));
3234 return;
3235
3236 case DEMANGLE_COMPONENT_TYPEINFO_FN:
3237 d_append_string (dpi, "typeinfo fn for ");
3238 d_print_comp (dpi, d_left (dc));
3239 return;
3240
3241 case DEMANGLE_COMPONENT_THUNK:
3242 d_append_string (dpi, "non-virtual thunk to ");
3243 d_print_comp (dpi, d_left (dc));
3244 return;
3245
3246 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
3247 d_append_string (dpi, "virtual thunk to ");
3248 d_print_comp (dpi, d_left (dc));
3249 return;
3250
3251 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
3252 d_append_string (dpi, "covariant return thunk to ");
3253 d_print_comp (dpi, d_left (dc));
3254 return;
3255
3256 case DEMANGLE_COMPONENT_JAVA_CLASS:
3257 d_append_string (dpi, "java Class for ");
3258 d_print_comp (dpi, d_left (dc));
3259 return;
3260
3261 case DEMANGLE_COMPONENT_GUARD:
3262 d_append_string (dpi, "guard variable for ");
3263 d_print_comp (dpi, d_left (dc));
3264 return;
3265
3266 case DEMANGLE_COMPONENT_REFTEMP:
3267 d_append_string (dpi, "reference temporary for ");
3268 d_print_comp (dpi, d_left (dc));
3269 return;
3270
3271 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
3272 d_append_string (dpi, "hidden alias for ");
3273 d_print_comp (dpi, d_left (dc));
3274 return;
3275
3276 case DEMANGLE_COMPONENT_SUB_STD:
3277 d_append_buffer (dpi, dc->u.s_string.string, dc->u.s_string.len);
3278 return;
3279
3280 case DEMANGLE_COMPONENT_RESTRICT:
3281 case DEMANGLE_COMPONENT_VOLATILE:
3282 case DEMANGLE_COMPONENT_CONST:
3283 {
3284 struct d_print_mod *pdpm;
3285
3286 /* When printing arrays, it's possible to have cases where the
3287 same CV-qualifier gets pushed on the stack multiple times.
3288 We only need to print it once. */
3289
3290 for (pdpm = dpi->modifiers; pdpm != NULL; pdpm = pdpm->next)
3291 {
3292 if (! pdpm->printed)
3293 {
3294 if (pdpm->mod->type != DEMANGLE_COMPONENT_RESTRICT
3295 && pdpm->mod->type != DEMANGLE_COMPONENT_VOLATILE
3296 && pdpm->mod->type != DEMANGLE_COMPONENT_CONST)
3297 break;
3298 if (pdpm->mod->type == dc->type)
3299 {
3300 d_print_comp (dpi, d_left (dc));
3301 return;
3302 }
3303 }
3304 }
3305 }
3306 /* Fall through. */
3307 case DEMANGLE_COMPONENT_RESTRICT_THIS:
3308 case DEMANGLE_COMPONENT_VOLATILE_THIS:
3309 case DEMANGLE_COMPONENT_CONST_THIS:
3310 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
3311 case DEMANGLE_COMPONENT_POINTER:
3312 case DEMANGLE_COMPONENT_REFERENCE:
3313 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
3314 case DEMANGLE_COMPONENT_COMPLEX:
3315 case DEMANGLE_COMPONENT_IMAGINARY:
3316 {
3317 /* We keep a list of modifiers on the stack. */
3318 struct d_print_mod dpm;
3319
3320 dpm.next = dpi->modifiers;
3321 dpi->modifiers = &dpm;
3322 dpm.mod = dc;
3323 dpm.printed = 0;
3324 dpm.templates = dpi->templates;
3325
3326 d_print_comp (dpi, d_left (dc));
3327
3328 /* If the modifier didn't get printed by the type, print it
3329 now. */
3330 if (! dpm.printed)
3331 d_print_mod (dpi, dc);
3332
3333 dpi->modifiers = dpm.next;
3334
3335 return;
3336 }
3337
3338 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
3339 if ((dpi->options & DMGL_JAVA) == 0)
3340 d_append_buffer (dpi, dc->u.s_builtin.type->name,
3341 dc->u.s_builtin.type->len);
3342 else
3343 d_append_buffer (dpi, dc->u.s_builtin.type->java_name,
3344 dc->u.s_builtin.type->java_len);
3345 return;
3346
3347 case DEMANGLE_COMPONENT_VENDOR_TYPE:
3348 d_print_comp (dpi, d_left (dc));
3349 return;
3350
3351 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
3352 {
3353 if ((dpi->options & DMGL_RET_POSTFIX) != 0)
3354 d_print_function_type (dpi, dc, dpi->modifiers);
3355
3356 /* Print return type if present */
3357 if (d_left (dc) != NULL)
3358 {
3359 struct d_print_mod dpm;
3360
3361 /* We must pass this type down as a modifier in order to
3362 print it in the right location. */
3363 dpm.next = dpi->modifiers;
3364 dpi->modifiers = &dpm;
3365 dpm.mod = dc;
3366 dpm.printed = 0;
3367 dpm.templates = dpi->templates;
3368
3369 d_print_comp (dpi, d_left (dc));
3370
3371 dpi->modifiers = dpm.next;
3372
3373 if (dpm.printed)
3374 return;
3375
3376 /* In standard prefix notation, there is a space between the
3377 return type and the function signature. */
3378 if ((dpi->options & DMGL_RET_POSTFIX) == 0)
3379 d_append_char (dpi, ' ');
3380 }
3381
3382 if ((dpi->options & DMGL_RET_POSTFIX) == 0)
3383 d_print_function_type (dpi, dc, dpi->modifiers);
3384
3385 return;
3386 }
3387
3388 case DEMANGLE_COMPONENT_ARRAY_TYPE:
3389 {
3390 struct d_print_mod *hold_modifiers;
3391 struct d_print_mod adpm[4];
3392 unsigned int i;
3393 struct d_print_mod *pdpm;
3394
3395 /* We must pass this type down as a modifier in order to print
3396 multi-dimensional arrays correctly. If the array itself is
3397 CV-qualified, we act as though the element type were
3398 CV-qualified. We do this by copying the modifiers down
3399 rather than fiddling pointers, so that we don't wind up
3400 with a d_print_mod higher on the stack pointing into our
3401 stack frame after we return. */
3402
3403 hold_modifiers = dpi->modifiers;
3404
3405 adpm[0].next = hold_modifiers;
3406 dpi->modifiers = &adpm[0];
3407 adpm[0].mod = dc;
3408 adpm[0].printed = 0;
3409 adpm[0].templates = dpi->templates;
3410
3411 i = 1;
3412 pdpm = hold_modifiers;
3413 while (pdpm != NULL
3414 && (pdpm->mod->type == DEMANGLE_COMPONENT_RESTRICT
3415 || pdpm->mod->type == DEMANGLE_COMPONENT_VOLATILE
3416 || pdpm->mod->type == DEMANGLE_COMPONENT_CONST))
3417 {
3418 if (! pdpm->printed)
3419 {
3420 if (i >= sizeof adpm / sizeof adpm[0])
3421 {
3422 d_print_error (dpi);
3423 return;
3424 }
3425
3426 adpm[i] = *pdpm;
3427 adpm[i].next = dpi->modifiers;
3428 dpi->modifiers = &adpm[i];
3429 pdpm->printed = 1;
3430 ++i;
3431 }
3432
3433 pdpm = pdpm->next;
3434 }
3435
3436 d_print_comp (dpi, d_right (dc));
3437
3438 dpi->modifiers = hold_modifiers;
3439
3440 if (adpm[0].printed)
3441 return;
3442
3443 while (i > 1)
3444 {
3445 --i;
3446 d_print_mod (dpi, adpm[i].mod);
3447 }
3448
3449 d_print_array_type (dpi, dc, dpi->modifiers);
3450
3451 return;
3452 }
3453
3454 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
3455 {
3456 struct d_print_mod dpm;
3457
3458 dpm.next = dpi->modifiers;
3459 dpi->modifiers = &dpm;
3460 dpm.mod = dc;
3461 dpm.printed = 0;
3462 dpm.templates = dpi->templates;
3463
3464 d_print_comp (dpi, d_right (dc));
3465
3466 /* If the modifier didn't get printed by the type, print it
3467 now. */
3468 if (! dpm.printed)
3469 {
3470 d_append_char (dpi, ' ');
3471 d_print_comp (dpi, d_left (dc));
3472 d_append_string (dpi, "::*");
3473 }
3474
3475 dpi->modifiers = dpm.next;
3476
3477 return;
3478 }
3479
3480 case DEMANGLE_COMPONENT_ARGLIST:
3481 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
3482 d_print_comp (dpi, d_left (dc));
3483 if (d_right (dc) != NULL)
3484 {
3485 d_append_string (dpi, ", ");
3486 d_print_comp (dpi, d_right (dc));
3487 }
3488 return;
3489
3490 case DEMANGLE_COMPONENT_OPERATOR:
3491 {
3492 char c;
3493
3494 d_append_string (dpi, "operator");
3495 c = dc->u.s_operator.op->name[0];
3496 if (IS_LOWER (c))
3497 d_append_char (dpi, ' ');
3498 d_append_buffer (dpi, dc->u.s_operator.op->name,
3499 dc->u.s_operator.op->len);
3500 return;
3501 }
3502
3503 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
3504 d_append_string (dpi, "operator ");
3505 d_print_comp (dpi, dc->u.s_extended_operator.name);
3506 return;
3507
3508 case DEMANGLE_COMPONENT_CAST:
3509 d_append_string (dpi, "operator ");
3510 d_print_cast (dpi, dc);
3511 return;
3512
3513 case DEMANGLE_COMPONENT_UNARY:
3514 if (d_left (dc)->type != DEMANGLE_COMPONENT_CAST)
3515 d_print_expr_op (dpi, d_left (dc));
3516 else
3517 {
3518 d_append_char (dpi, '(');
3519 d_print_cast (dpi, d_left (dc));
3520 d_append_char (dpi, ')');
3521 }
3522 d_append_char (dpi, '(');
3523 d_print_comp (dpi, d_right (dc));
3524 d_append_char (dpi, ')');
3525 return;
3526
3527 case DEMANGLE_COMPONENT_BINARY:
3528 if (d_right (dc)->type != DEMANGLE_COMPONENT_BINARY_ARGS)
3529 {
3530 d_print_error (dpi);
3531 return;
3532 }
3533
3534 /* We wrap an expression which uses the greater-than operator in
3535 an extra layer of parens so that it does not get confused
3536 with the '>' which ends the template parameters. */
3537 if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
3538 && d_left (dc)->u.s_operator.op->len == 1
3539 && d_left (dc)->u.s_operator.op->name[0] == '>')
3540 d_append_char (dpi, '(');
3541
3542 d_append_char (dpi, '(');
3543 d_print_comp (dpi, d_left (d_right (dc)));
3544 d_append_string (dpi, ") ");
3545 d_print_expr_op (dpi, d_left (dc));
3546 d_append_string (dpi, " (");
3547 d_print_comp (dpi, d_right (d_right (dc)));
3548 d_append_char (dpi, ')');
3549
3550 if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
3551 && d_left (dc)->u.s_operator.op->len == 1
3552 && d_left (dc)->u.s_operator.op->name[0] == '>')
3553 d_append_char (dpi, ')');
3554
3555 return;
3556
3557 case DEMANGLE_COMPONENT_BINARY_ARGS:
3558 /* We should only see this as part of DEMANGLE_COMPONENT_BINARY. */
3559 d_print_error (dpi);
3560 return;
3561
3562 case DEMANGLE_COMPONENT_TRINARY:
3563 if (d_right (dc)->type != DEMANGLE_COMPONENT_TRINARY_ARG1
3564 || d_right (d_right (dc))->type != DEMANGLE_COMPONENT_TRINARY_ARG2)
3565 {
3566 d_print_error (dpi);
3567 return;
3568 }
3569 d_append_char (dpi, '(');
3570 d_print_comp (dpi, d_left (d_right (dc)));
3571 d_append_string (dpi, ") ");
3572 d_print_expr_op (dpi, d_left (dc));
3573 d_append_string (dpi, " (");
3574 d_print_comp (dpi, d_left (d_right (d_right (dc))));
3575 d_append_string (dpi, ") : (");
3576 d_print_comp (dpi, d_right (d_right (d_right (dc))));
3577 d_append_char (dpi, ')');
3578 return;
3579
3580 case DEMANGLE_COMPONENT_TRINARY_ARG1:
3581 case DEMANGLE_COMPONENT_TRINARY_ARG2:
3582 /* We should only see these are part of DEMANGLE_COMPONENT_TRINARY. */
3583 d_print_error (dpi);
3584 return;
3585
3586 case DEMANGLE_COMPONENT_LITERAL:
3587 case DEMANGLE_COMPONENT_LITERAL_NEG:
3588 {
3589 enum d_builtin_type_print tp;
3590
3591 /* For some builtin types, produce simpler output. */
3592 tp = D_PRINT_DEFAULT;
3593 if (d_left (dc)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE)
3594 {
3595 tp = d_left (dc)->u.s_builtin.type->print;
3596 switch (tp)
3597 {
3598 case D_PRINT_INT:
3599 case D_PRINT_UNSIGNED:
3600 case D_PRINT_LONG:
3601 case D_PRINT_UNSIGNED_LONG:
3602 case D_PRINT_LONG_LONG:
3603 case D_PRINT_UNSIGNED_LONG_LONG:
3604 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME)
3605 {
3606 if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
3607 d_append_char (dpi, '-');
3608 d_print_comp (dpi, d_right (dc));
3609 switch (tp)
3610 {
3611 default:
3612 break;
3613 case D_PRINT_UNSIGNED:
3614 d_append_char (dpi, 'u');
3615 break;
3616 case D_PRINT_LONG:
3617 d_append_char (dpi, 'l');
3618 break;
3619 case D_PRINT_UNSIGNED_LONG:
3620 d_append_string (dpi, "ul");
3621 break;
3622 case D_PRINT_LONG_LONG:
3623 d_append_string (dpi, "ll");
3624 break;
3625 case D_PRINT_UNSIGNED_LONG_LONG:
3626 d_append_string (dpi, "ull");
3627 break;
3628 }
3629 return;
3630 }
3631 break;
3632
3633 case D_PRINT_BOOL:
3634 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME
3635 && d_right (dc)->u.s_name.len == 1
3636 && dc->type == DEMANGLE_COMPONENT_LITERAL)
3637 {
3638 switch (d_right (dc)->u.s_name.s[0])
3639 {
3640 case '0':
3641 d_append_string (dpi, "false");
3642 return;
3643 case '1':
3644 d_append_string (dpi, "true");
3645 return;
3646 default:
3647 break;
3648 }
3649 }
3650 break;
3651
3652 default:
3653 break;
3654 }
3655 }
3656
3657 d_append_char (dpi, '(');
3658 d_print_comp (dpi, d_left (dc));
3659 d_append_char (dpi, ')');
3660 if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
3661 d_append_char (dpi, '-');
3662 if (tp == D_PRINT_FLOAT)
3663 d_append_char (dpi, '[');
3664 d_print_comp (dpi, d_right (dc));
3665 if (tp == D_PRINT_FLOAT)
3666 d_append_char (dpi, ']');
3667 }
3668 return;
3669
3670 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
3671 d_append_string (dpi, "java resource ");
3672 d_print_comp (dpi, d_left (dc));
3673 return;
3674
3675 case DEMANGLE_COMPONENT_COMPOUND_NAME:
3676 d_print_comp (dpi, d_left (dc));
3677 d_print_comp (dpi, d_right (dc));
3678 return;
3679
3680 case DEMANGLE_COMPONENT_CHARACTER:
3681 d_append_char (dpi, dc->u.s_character.character);
3682 return;
3683
3684 default:
3685 d_print_error (dpi);
3686 return;
3687 }
3688 }
3689
3690 /* Print a Java dentifier. For Java we try to handle encoded extended
3691 Unicode characters. The C++ ABI doesn't mention Unicode encoding,
3692 so we don't it for C++. Characters are encoded as
3693 __U<hex-char>+_. */
3694
3695 static void
3696 d_print_java_identifier (struct d_print_info *dpi, const char *name, int len)
3697 {
3698 const char *p;
3699 const char *end;
3700
3701 end = name + len;
3702 for (p = name; p < end; ++p)
3703 {
3704 if (end - p > 3
3705 && p[0] == '_'
3706 && p[1] == '_'
3707 && p[2] == 'U')
3708 {
3709 unsigned long c;
3710 const char *q;
3711
3712 c = 0;
3713 for (q = p + 3; q < end; ++q)
3714 {
3715 int dig;
3716
3717 if (IS_DIGIT (*q))
3718 dig = *q - '0';
3719 else if (*q >= 'A' && *q <= 'F')
3720 dig = *q - 'A' + 10;
3721 else if (*q >= 'a' && *q <= 'f')
3722 dig = *q - 'a' + 10;
3723 else
3724 break;
3725
3726 c = c * 16 + dig;
3727 }
3728 /* If the Unicode character is larger than 256, we don't try
3729 to deal with it here. FIXME. */
3730 if (q < end && *q == '_' && c < 256)
3731 {
3732 d_append_char (dpi, c);
3733 p = q;
3734 continue;
3735 }
3736 }
3737
3738 d_append_char (dpi, *p);
3739 }
3740 }
3741
3742 /* Print a list of modifiers. SUFFIX is 1 if we are printing
3743 qualifiers on this after printing a function. */
3744
3745 static void
3746 d_print_mod_list (struct d_print_info *dpi,
3747 struct d_print_mod *mods, int suffix)
3748 {
3749 struct d_print_template *hold_dpt;
3750
3751 if (mods == NULL || d_print_saw_error (dpi))
3752 return;
3753
3754 if (mods->printed
3755 || (! suffix
3756 && (mods->mod->type == DEMANGLE_COMPONENT_RESTRICT_THIS
3757 || mods->mod->type == DEMANGLE_COMPONENT_VOLATILE_THIS
3758 || mods->mod->type == DEMANGLE_COMPONENT_CONST_THIS)))
3759 {
3760 d_print_mod_list (dpi, mods->next, suffix);
3761 return;
3762 }
3763
3764 mods->printed = 1;
3765
3766 hold_dpt = dpi->templates;
3767 dpi->templates = mods->templates;
3768
3769 if (mods->mod->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
3770 {
3771 d_print_function_type (dpi, mods->mod, mods->next);
3772 dpi->templates = hold_dpt;
3773 return;
3774 }
3775 else if (mods->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
3776 {
3777 d_print_array_type (dpi, mods->mod, mods->next);
3778 dpi->templates = hold_dpt;
3779 return;
3780 }
3781 else if (mods->mod->type == DEMANGLE_COMPONENT_LOCAL_NAME)
3782 {
3783 struct d_print_mod *hold_modifiers;
3784 struct demangle_component *dc;
3785
3786 /* When this is on the modifier stack, we have pulled any
3787 qualifiers off the right argument already. Otherwise, we
3788 print it as usual, but don't let the left argument see any
3789 modifiers. */
3790
3791 hold_modifiers = dpi->modifiers;
3792 dpi->modifiers = NULL;
3793 d_print_comp (dpi, d_left (mods->mod));
3794 dpi->modifiers = hold_modifiers;
3795
3796 if ((dpi->options & DMGL_JAVA) == 0)
3797 d_append_string (dpi, "::");
3798 else
3799 d_append_char (dpi, '.');
3800
3801 dc = d_right (mods->mod);
3802 while (dc->type == DEMANGLE_COMPONENT_RESTRICT_THIS
3803 || dc->type == DEMANGLE_COMPONENT_VOLATILE_THIS
3804 || dc->type == DEMANGLE_COMPONENT_CONST_THIS)
3805 dc = d_left (dc);
3806
3807 d_print_comp (dpi, dc);
3808
3809 dpi->templates = hold_dpt;
3810 return;
3811 }
3812
3813 d_print_mod (dpi, mods->mod);
3814
3815 dpi->templates = hold_dpt;
3816
3817 d_print_mod_list (dpi, mods->next, suffix);
3818 }
3819
3820 /* Print a modifier. */
3821
3822 static void
3823 d_print_mod (struct d_print_info *dpi,
3824 const struct demangle_component *mod)
3825 {
3826 switch (mod->type)
3827 {
3828 case DEMANGLE_COMPONENT_RESTRICT:
3829 case DEMANGLE_COMPONENT_RESTRICT_THIS:
3830 d_append_string (dpi, " restrict");
3831 return;
3832 case DEMANGLE_COMPONENT_VOLATILE:
3833 case DEMANGLE_COMPONENT_VOLATILE_THIS:
3834 d_append_string (dpi, " volatile");
3835 return;
3836 case DEMANGLE_COMPONENT_CONST:
3837 case DEMANGLE_COMPONENT_CONST_THIS:
3838 d_append_string (dpi, " const");
3839 return;
3840 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
3841 d_append_char (dpi, ' ');
3842 d_print_comp (dpi, d_right (mod));
3843 return;
3844 case DEMANGLE_COMPONENT_POINTER:
3845 /* There is no pointer symbol in Java. */
3846 if ((dpi->options & DMGL_JAVA) == 0)
3847 d_append_char (dpi, '*');
3848 return;
3849 case DEMANGLE_COMPONENT_REFERENCE:
3850 d_append_char (dpi, '&');
3851 return;
3852 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
3853 d_append_string (dpi, "&&");
3854 return;
3855 case DEMANGLE_COMPONENT_COMPLEX:
3856 d_append_string (dpi, "complex ");
3857 return;
3858 case DEMANGLE_COMPONENT_IMAGINARY:
3859 d_append_string (dpi, "imaginary ");
3860 return;
3861 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
3862 if (d_last_char (dpi) != '(')
3863 d_append_char (dpi, ' ');
3864 d_print_comp (dpi, d_left (mod));
3865 d_append_string (dpi, "::*");
3866 return;
3867 case DEMANGLE_COMPONENT_TYPED_NAME:
3868 d_print_comp (dpi, d_left (mod));
3869 return;
3870 default:
3871 /* Otherwise, we have something that won't go back on the
3872 modifier stack, so we can just print it. */
3873 d_print_comp (dpi, mod);
3874 return;
3875 }
3876 }
3877
3878 /* Print a function type, except for the return type. */
3879
3880 static void
3881 d_print_function_type (struct d_print_info *dpi,
3882 const struct demangle_component *dc,
3883 struct d_print_mod *mods)
3884 {
3885 int need_paren;
3886 int saw_mod;
3887 int need_space;
3888 struct d_print_mod *p;
3889 struct d_print_mod *hold_modifiers;
3890
3891 need_paren = 0;
3892 saw_mod = 0;
3893 need_space = 0;
3894 for (p = mods; p != NULL; p = p->next)
3895 {
3896 if (p->printed)
3897 break;
3898
3899 saw_mod = 1;
3900 switch (p->mod->type)
3901 {
3902 case DEMANGLE_COMPONENT_POINTER:
3903 case DEMANGLE_COMPONENT_REFERENCE:
3904 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
3905 need_paren = 1;
3906 break;
3907 case DEMANGLE_COMPONENT_RESTRICT:
3908 case DEMANGLE_COMPONENT_VOLATILE:
3909 case DEMANGLE_COMPONENT_CONST:
3910 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
3911 case DEMANGLE_COMPONENT_COMPLEX:
3912 case DEMANGLE_COMPONENT_IMAGINARY:
3913 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
3914 need_space = 1;
3915 need_paren = 1;
3916 break;
3917 case DEMANGLE_COMPONENT_RESTRICT_THIS:
3918 case DEMANGLE_COMPONENT_VOLATILE_THIS:
3919 case DEMANGLE_COMPONENT_CONST_THIS:
3920 break;
3921 default:
3922 break;
3923 }
3924 if (need_paren)
3925 break;
3926 }
3927
3928 if (d_left (dc) != NULL && ! saw_mod)
3929 need_paren = 1;
3930
3931 if (need_paren)
3932 {
3933 if (! need_space)
3934 {
3935 if (d_last_char (dpi) != '('
3936 && d_last_char (dpi) != '*')
3937 need_space = 1;
3938 }
3939 if (need_space && d_last_char (dpi) != ' ')
3940 d_append_char (dpi, ' ');
3941 d_append_char (dpi, '(');
3942 }
3943
3944 hold_modifiers = dpi->modifiers;
3945 dpi->modifiers = NULL;
3946
3947 d_print_mod_list (dpi, mods, 0);
3948
3949 if (need_paren)
3950 d_append_char (dpi, ')');
3951
3952 d_append_char (dpi, '(');
3953
3954 if (d_right (dc) != NULL)
3955 d_print_comp (dpi, d_right (dc));
3956
3957 d_append_char (dpi, ')');
3958
3959 d_print_mod_list (dpi, mods, 1);
3960
3961 dpi->modifiers = hold_modifiers;
3962 }
3963
3964 /* Print an array type, except for the element type. */
3965
3966 static void
3967 d_print_array_type (struct d_print_info *dpi,
3968 const struct demangle_component *dc,
3969 struct d_print_mod *mods)
3970 {
3971 int need_space;
3972
3973 need_space = 1;
3974 if (mods != NULL)
3975 {
3976 int need_paren;
3977 struct d_print_mod *p;
3978
3979 need_paren = 0;
3980 for (p = mods; p != NULL; p = p->next)
3981 {
3982 if (! p->printed)
3983 {
3984 if (p->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
3985 {
3986 need_space = 0;
3987 break;
3988 }
3989 else
3990 {
3991 need_paren = 1;
3992 need_space = 1;
3993 break;
3994 }
3995 }
3996 }
3997
3998 if (need_paren)
3999 d_append_string (dpi, " (");
4000
4001 d_print_mod_list (dpi, mods, 0);
4002
4003 if (need_paren)
4004 d_append_char (dpi, ')');
4005 }
4006
4007 if (need_space)
4008 d_append_char (dpi, ' ');
4009
4010 d_append_char (dpi, '[');
4011
4012 if (d_left (dc) != NULL)
4013 d_print_comp (dpi, d_left (dc));
4014
4015 d_append_char (dpi, ']');
4016 }
4017
4018 /* Print an operator in an expression. */
4019
4020 static void
4021 d_print_expr_op (struct d_print_info *dpi,
4022 const struct demangle_component *dc)
4023 {
4024 if (dc->type == DEMANGLE_COMPONENT_OPERATOR)
4025 d_append_buffer (dpi, dc->u.s_operator.op->name,
4026 dc->u.s_operator.op->len);
4027 else
4028 d_print_comp (dpi, dc);
4029 }
4030
4031 /* Print a cast. */
4032
4033 static void
4034 d_print_cast (struct d_print_info *dpi,
4035 const struct demangle_component *dc)
4036 {
4037 if (d_left (dc)->type != DEMANGLE_COMPONENT_TEMPLATE)
4038 d_print_comp (dpi, d_left (dc));
4039 else
4040 {
4041 struct d_print_mod *hold_dpm;
4042 struct d_print_template dpt;
4043
4044 /* It appears that for a templated cast operator, we need to put
4045 the template parameters in scope for the operator name, but
4046 not for the parameters. The effect is that we need to handle
4047 the template printing here. */
4048
4049 hold_dpm = dpi->modifiers;
4050 dpi->modifiers = NULL;
4051
4052 dpt.next = dpi->templates;
4053 dpi->templates = &dpt;
4054 dpt.template_decl = d_left (dc);
4055
4056 d_print_comp (dpi, d_left (d_left (dc)));
4057
4058 dpi->templates = dpt.next;
4059
4060 if (d_last_char (dpi) == '<')
4061 d_append_char (dpi, ' ');
4062 d_append_char (dpi, '<');
4063 d_print_comp (dpi, d_right (d_left (dc)));
4064 /* Avoid generating two consecutive '>' characters, to avoid
4065 the C++ syntactic ambiguity. */
4066 if (d_last_char (dpi) == '>')
4067 d_append_char (dpi, ' ');
4068 d_append_char (dpi, '>');
4069
4070 dpi->modifiers = hold_dpm;
4071 }
4072 }
4073
4074 /* Initialize the information structure we use to pass around
4075 information. */
4076
4077 CP_STATIC_IF_GLIBCPP_V3
4078 void
4079 cplus_demangle_init_info (const char *mangled, int options, size_t len,
4080 struct d_info *di)
4081 {
4082 di->s = mangled;
4083 di->send = mangled + len;
4084 di->options = options;
4085
4086 di->n = mangled;
4087
4088 /* We can not need more components than twice the number of chars in
4089 the mangled string. Most components correspond directly to
4090 chars, but the ARGLIST types are exceptions. */
4091 di->num_comps = 2 * len;
4092 di->next_comp = 0;
4093
4094 /* Similarly, we can not need more substitutions than there are
4095 chars in the mangled string. */
4096 di->num_subs = len;
4097 di->next_sub = 0;
4098 di->did_subs = 0;
4099
4100 di->last_name = NULL;
4101
4102 di->expansion = 0;
4103 }
4104
4105 /* Internal implementation for the demangler. If MANGLED is a g++ v3 ABI
4106 mangled name, return strings in repeated callback giving the demangled
4107 name. OPTIONS is the usual libiberty demangler options. On success,
4108 this returns 1. On failure, returns 0. */
4109
4110 static int
4111 d_demangle_callback (const char *mangled, int options,
4112 demangle_callbackref callback, void *opaque)
4113 {
4114 int type;
4115 struct d_info di;
4116 struct demangle_component *dc;
4117 int status;
4118
4119 if (mangled[0] == '_' && mangled[1] == 'Z')
4120 type = 0;
4121 else if (strncmp (mangled, "_GLOBAL_", 8) == 0
4122 && (mangled[8] == '.' || mangled[8] == '_' || mangled[8] == '$')
4123 && (mangled[9] == 'D' || mangled[9] == 'I')
4124 && mangled[10] == '_')
4125 {
4126 const char *intro;
4127
4128 intro = (mangled[9] == 'I')
4129 ? "global constructors keyed to "
4130 : "global destructors keyed to ";
4131
4132 callback (intro, strlen (intro), opaque);
4133 callback (mangled + 11, strlen (mangled + 11), opaque);
4134 return 1;
4135 }
4136 else
4137 {
4138 if ((options & DMGL_TYPES) == 0)
4139 return 0;
4140 type = 1;
4141 }
4142
4143 cplus_demangle_init_info (mangled, options, strlen (mangled), &di);
4144
4145 {
4146 #ifdef CP_DYNAMIC_ARRAYS
4147 __extension__ struct demangle_component comps[di.num_comps];
4148 __extension__ struct demangle_component *subs[di.num_subs];
4149
4150 di.comps = comps;
4151 di.subs = subs;
4152 #else
4153 di.comps = alloca (di.num_comps * sizeof (*di.comps));
4154 di.subs = alloca (di.num_subs * sizeof (*di.subs));
4155 #endif
4156
4157 if (type)
4158 dc = cplus_demangle_type (&di);
4159 else
4160 dc = cplus_demangle_mangled_name (&di, 1);
4161
4162 /* If DMGL_PARAMS is set, then if we didn't consume the entire
4163 mangled string, then we didn't successfully demangle it. If
4164 DMGL_PARAMS is not set, we didn't look at the trailing
4165 parameters. */
4166 if (((options & DMGL_PARAMS) != 0) && d_peek_char (&di) != '\0')
4167 dc = NULL;
4168
4169 #ifdef CP_DEMANGLE_DEBUG
4170 d_dump (dc, 0);
4171 #endif
4172
4173 status = (dc != NULL)
4174 ? cplus_demangle_print_callback (options, dc, callback, opaque)
4175 : 0;
4176 }
4177
4178 return status;
4179 }
4180
4181 /* Entry point for the demangler. If MANGLED is a g++ v3 ABI mangled
4182 name, return a buffer allocated with malloc holding the demangled
4183 name. OPTIONS is the usual libiberty demangler options. On
4184 success, this sets *PALC to the allocated size of the returned
4185 buffer. On failure, this sets *PALC to 0 for a bad name, or 1 for
4186 a memory allocation failure, and returns NULL. */
4187
4188 static char *
4189 d_demangle (const char *mangled, int options, size_t *palc)
4190 {
4191 struct d_growable_string dgs;
4192 int status;
4193
4194 d_growable_string_init (&dgs, 0);
4195
4196 status = d_demangle_callback (mangled, options,
4197 d_growable_string_callback_adapter, &dgs);
4198 if (status == 0)
4199 {
4200 free (dgs.buf);
4201 *palc = 0;
4202 return NULL;
4203 }
4204
4205 *palc = dgs.allocation_failure ? 1 : 0;
4206 return dgs.buf;
4207 }
4208
4209 #if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3)
4210
4211 extern char *__cxa_demangle (const char *, char *, size_t *, int *);
4212
4213 /* ia64 ABI-mandated entry point in the C++ runtime library for
4214 performing demangling. MANGLED_NAME is a NUL-terminated character
4215 string containing the name to be demangled.
4216
4217 OUTPUT_BUFFER is a region of memory, allocated with malloc, of
4218 *LENGTH bytes, into which the demangled name is stored. If
4219 OUTPUT_BUFFER is not long enough, it is expanded using realloc.
4220 OUTPUT_BUFFER may instead be NULL; in that case, the demangled name
4221 is placed in a region of memory allocated with malloc.
4222
4223 If LENGTH is non-NULL, the length of the buffer containing the
4224 demangled name, is placed in *LENGTH.
4225
4226 The return value is a pointer to the start of the NUL-terminated
4227 demangled name, or NULL if the demangling fails. The caller is
4228 responsible for deallocating this memory using free.
4229
4230 *STATUS is set to one of the following values:
4231 0: The demangling operation succeeded.
4232 -1: A memory allocation failure occurred.
4233 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
4234 -3: One of the arguments is invalid.
4235
4236 The demangling is performed using the C++ ABI mangling rules, with
4237 GNU extensions. */
4238
4239 char *
4240 __cxa_demangle (const char *mangled_name, char *output_buffer,
4241 size_t *length, int *status)
4242 {
4243 char *demangled;
4244 size_t alc;
4245
4246 if (mangled_name == NULL)
4247 {
4248 if (status != NULL)
4249 *status = -3;
4250 return NULL;
4251 }
4252
4253 if (output_buffer != NULL && length == NULL)
4254 {
4255 if (status != NULL)
4256 *status = -3;
4257 return NULL;
4258 }
4259
4260 demangled = d_demangle (mangled_name, DMGL_PARAMS | DMGL_TYPES, &alc);
4261
4262 if (demangled == NULL)
4263 {
4264 if (status != NULL)
4265 {
4266 if (alc == 1)
4267 *status = -1;
4268 else
4269 *status = -2;
4270 }
4271 return NULL;
4272 }
4273
4274 if (output_buffer == NULL)
4275 {
4276 if (length != NULL)
4277 *length = alc;
4278 }
4279 else
4280 {
4281 if (strlen (demangled) < *length)
4282 {
4283 strcpy (output_buffer, demangled);
4284 free (demangled);
4285 demangled = output_buffer;
4286 }
4287 else
4288 {
4289 free (output_buffer);
4290 *length = alc;
4291 }
4292 }
4293
4294 if (status != NULL)
4295 *status = 0;
4296
4297 return demangled;
4298 }
4299
4300 extern int __gcclibcxx_demangle_callback (const char *,
4301 void (*)
4302 (const char *, size_t, void *),
4303 void *);
4304
4305 /* Alternative, allocationless entry point in the C++ runtime library
4306 for performing demangling. MANGLED_NAME is a NUL-terminated character
4307 string containing the name to be demangled.
4308
4309 CALLBACK is a callback function, called with demangled string
4310 segments as demangling progresses; it is called at least once,
4311 but may be called more than once. OPAQUE is a generalized pointer
4312 used as a callback argument.
4313
4314 The return code is one of the following values, equivalent to
4315 the STATUS values of __cxa_demangle() (excluding -1, since this
4316 function performs no memory allocations):
4317 0: The demangling operation succeeded.
4318 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
4319 -3: One of the arguments is invalid.
4320
4321 The demangling is performed using the C++ ABI mangling rules, with
4322 GNU extensions. */
4323
4324 int
4325 __gcclibcxx_demangle_callback (const char *mangled_name,
4326 void (*callback) (const char *, size_t, void *),
4327 void *opaque)
4328 {
4329 int status;
4330
4331 if (mangled_name == NULL || callback == NULL)
4332 return -3;
4333
4334 status = d_demangle_callback (mangled_name, DMGL_PARAMS | DMGL_TYPES,
4335 callback, opaque);
4336 if (status == 0)
4337 return -2;
4338
4339 return 0;
4340 }
4341
4342 #else /* ! (IN_LIBGCC2 || IN_GLIBCPP_V3) */
4343
4344 /* Entry point for libiberty demangler. If MANGLED is a g++ v3 ABI
4345 mangled name, return a buffer allocated with malloc holding the
4346 demangled name. Otherwise, return NULL. */
4347
4348 char *
4349 cplus_demangle_v3 (const char *mangled, int options)
4350 {
4351 size_t alc;
4352
4353 return d_demangle (mangled, options, &alc);
4354 }
4355
4356 int
4357 cplus_demangle_v3_callback (const char *mangled, int options,
4358 demangle_callbackref callback, void *opaque)
4359 {
4360 return d_demangle_callback (mangled, options, callback, opaque);
4361 }
4362
4363 /* Demangle a Java symbol. Java uses a subset of the V3 ABI C++ mangling
4364 conventions, but the output formatting is a little different.
4365 This instructs the C++ demangler not to emit pointer characters ("*"), to
4366 use Java's namespace separator symbol ("." instead of "::"), and to output
4367 JArray<TYPE> as TYPE[]. */
4368
4369 char *
4370 java_demangle_v3 (const char *mangled)
4371 {
4372 size_t alc;
4373
4374 return d_demangle (mangled, DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX, &alc);
4375 }
4376
4377 int
4378 java_demangle_v3_callback (const char *mangled,
4379 demangle_callbackref callback, void *opaque)
4380 {
4381 return d_demangle_callback (mangled,
4382 DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX,
4383 callback, opaque);
4384 }
4385
4386 #endif /* IN_LIBGCC2 || IN_GLIBCPP_V3 */
4387
4388 #ifndef IN_GLIBCPP_V3
4389
4390 /* Demangle a string in order to find out whether it is a constructor
4391 or destructor. Return non-zero on success. Set *CTOR_KIND and
4392 *DTOR_KIND appropriately. */
4393
4394 static int
4395 is_ctor_or_dtor (const char *mangled,
4396 enum gnu_v3_ctor_kinds *ctor_kind,
4397 enum gnu_v3_dtor_kinds *dtor_kind)
4398 {
4399 struct d_info di;
4400 struct demangle_component *dc;
4401 int ret;
4402
4403 *ctor_kind = (enum gnu_v3_ctor_kinds) 0;
4404 *dtor_kind = (enum gnu_v3_dtor_kinds) 0;
4405
4406 cplus_demangle_init_info (mangled, DMGL_GNU_V3, strlen (mangled), &di);
4407
4408 {
4409 #ifdef CP_DYNAMIC_ARRAYS
4410 __extension__ struct demangle_component comps[di.num_comps];
4411 __extension__ struct demangle_component *subs[di.num_subs];
4412
4413 di.comps = comps;
4414 di.subs = subs;
4415 #else
4416 di.comps = alloca (di.num_comps * sizeof (*di.comps));
4417 di.subs = alloca (di.num_subs * sizeof (*di.subs));
4418 #endif
4419
4420 dc = cplus_demangle_mangled_name (&di, 1);
4421
4422 /* Note that because we did not pass DMGL_PARAMS, we don't expect
4423 to demangle the entire string. */
4424
4425 ret = 0;
4426 while (dc != NULL)
4427 {
4428 switch (dc->type)
4429 {
4430 default:
4431 dc = NULL;
4432 break;
4433 case DEMANGLE_COMPONENT_TYPED_NAME:
4434 case DEMANGLE_COMPONENT_TEMPLATE:
4435 case DEMANGLE_COMPONENT_RESTRICT_THIS:
4436 case DEMANGLE_COMPONENT_VOLATILE_THIS:
4437 case DEMANGLE_COMPONENT_CONST_THIS:
4438 dc = d_left (dc);
4439 break;
4440 case DEMANGLE_COMPONENT_QUAL_NAME:
4441 case DEMANGLE_COMPONENT_LOCAL_NAME:
4442 dc = d_right (dc);
4443 break;
4444 case DEMANGLE_COMPONENT_CTOR:
4445 *ctor_kind = dc->u.s_ctor.kind;
4446 ret = 1;
4447 dc = NULL;
4448 break;
4449 case DEMANGLE_COMPONENT_DTOR:
4450 *dtor_kind = dc->u.s_dtor.kind;
4451 ret = 1;
4452 dc = NULL;
4453 break;
4454 }
4455 }
4456 }
4457
4458 return ret;
4459 }
4460
4461 /* Return whether NAME is the mangled form of a g++ V3 ABI constructor
4462 name. A non-zero return indicates the type of constructor. */
4463
4464 enum gnu_v3_ctor_kinds
4465 is_gnu_v3_mangled_ctor (const char *name)
4466 {
4467 enum gnu_v3_ctor_kinds ctor_kind;
4468 enum gnu_v3_dtor_kinds dtor_kind;
4469
4470 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
4471 return (enum gnu_v3_ctor_kinds) 0;
4472 return ctor_kind;
4473 }
4474
4475
4476 /* Return whether NAME is the mangled form of a g++ V3 ABI destructor
4477 name. A non-zero return indicates the type of destructor. */
4478
4479 enum gnu_v3_dtor_kinds
4480 is_gnu_v3_mangled_dtor (const char *name)
4481 {
4482 enum gnu_v3_ctor_kinds ctor_kind;
4483 enum gnu_v3_dtor_kinds dtor_kind;
4484
4485 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
4486 return (enum gnu_v3_dtor_kinds) 0;
4487 return dtor_kind;
4488 }
4489
4490 #endif /* IN_GLIBCPP_V3 */
4491
4492 #ifdef STANDALONE_DEMANGLER
4493
4494 #include "getopt.h"
4495 #include "dyn-string.h"
4496
4497 static void print_usage (FILE* fp, int exit_value);
4498
4499 #define IS_ALPHA(CHAR) \
4500 (((CHAR) >= 'a' && (CHAR) <= 'z') \
4501 || ((CHAR) >= 'A' && (CHAR) <= 'Z'))
4502
4503 /* Non-zero if CHAR is a character than can occur in a mangled name. */
4504 #define is_mangled_char(CHAR) \
4505 (IS_ALPHA (CHAR) || IS_DIGIT (CHAR) \
4506 || (CHAR) == '_' || (CHAR) == '.' || (CHAR) == '$')
4507
4508 /* The name of this program, as invoked. */
4509 const char* program_name;
4510
4511 /* Prints usage summary to FP and then exits with EXIT_VALUE. */
4512
4513 static void
4514 print_usage (FILE* fp, int exit_value)
4515 {
4516 fprintf (fp, "Usage: %s [options] [names ...]\n", program_name);
4517 fprintf (fp, "Options:\n");
4518 fprintf (fp, " -h,--help Display this message.\n");
4519 fprintf (fp, " -p,--no-params Don't display function parameters\n");
4520 fprintf (fp, " -v,--verbose Produce verbose demanglings.\n");
4521 fprintf (fp, "If names are provided, they are demangled. Otherwise filters standard input.\n");
4522
4523 exit (exit_value);
4524 }
4525
4526 /* Option specification for getopt_long. */
4527 static const struct option long_options[] =
4528 {
4529 { "help", no_argument, NULL, 'h' },
4530 { "no-params", no_argument, NULL, 'p' },
4531 { "verbose", no_argument, NULL, 'v' },
4532 { NULL, no_argument, NULL, 0 },
4533 };
4534
4535 /* Main entry for a demangling filter executable. It will demangle
4536 its command line arguments, if any. If none are provided, it will
4537 filter stdin to stdout, replacing any recognized mangled C++ names
4538 with their demangled equivalents. */
4539
4540 int
4541 main (int argc, char *argv[])
4542 {
4543 int i;
4544 int opt_char;
4545 int options = DMGL_PARAMS | DMGL_ANSI | DMGL_TYPES;
4546
4547 /* Use the program name of this program, as invoked. */
4548 program_name = argv[0];
4549
4550 /* Parse options. */
4551 do
4552 {
4553 opt_char = getopt_long (argc, argv, "hpv", long_options, NULL);
4554 switch (opt_char)
4555 {
4556 case '?': /* Unrecognized option. */
4557 print_usage (stderr, 1);
4558 break;
4559
4560 case 'h':
4561 print_usage (stdout, 0);
4562 break;
4563
4564 case 'p':
4565 options &= ~ DMGL_PARAMS;
4566 break;
4567
4568 case 'v':
4569 options |= DMGL_VERBOSE;
4570 break;
4571 }
4572 }
4573 while (opt_char != -1);
4574
4575 if (optind == argc)
4576 /* No command line arguments were provided. Filter stdin. */
4577 {
4578 dyn_string_t mangled = dyn_string_new (3);
4579 char *s;
4580
4581 /* Read all of input. */
4582 while (!feof (stdin))
4583 {
4584 char c;
4585
4586 /* Pile characters into mangled until we hit one that can't
4587 occur in a mangled name. */
4588 c = getchar ();
4589 while (!feof (stdin) && is_mangled_char (c))
4590 {
4591 dyn_string_append_char (mangled, c);
4592 if (feof (stdin))
4593 break;
4594 c = getchar ();
4595 }
4596
4597 if (dyn_string_length (mangled) > 0)
4598 {
4599 #ifdef IN_GLIBCPP_V3
4600 s = __cxa_demangle (dyn_string_buf (mangled), NULL, NULL, NULL);
4601 #else
4602 s = cplus_demangle_v3 (dyn_string_buf (mangled), options);
4603 #endif
4604
4605 if (s != NULL)
4606 {
4607 fputs (s, stdout);
4608 free (s);
4609 }
4610 else
4611 {
4612 /* It might not have been a mangled name. Print the
4613 original text. */
4614 fputs (dyn_string_buf (mangled), stdout);
4615 }
4616
4617 dyn_string_clear (mangled);
4618 }
4619
4620 /* If we haven't hit EOF yet, we've read one character that
4621 can't occur in a mangled name, so print it out. */
4622 if (!feof (stdin))
4623 putchar (c);
4624 }
4625
4626 dyn_string_delete (mangled);
4627 }
4628 else
4629 /* Demangle command line arguments. */
4630 {
4631 /* Loop over command line arguments. */
4632 for (i = optind; i < argc; ++i)
4633 {
4634 char *s;
4635 #ifdef IN_GLIBCPP_V3
4636 int status;
4637 #endif
4638
4639 /* Attempt to demangle. */
4640 #ifdef IN_GLIBCPP_V3
4641 s = __cxa_demangle (argv[i], NULL, NULL, &status);
4642 #else
4643 s = cplus_demangle_v3 (argv[i], options);
4644 #endif
4645
4646 /* If it worked, print the demangled name. */
4647 if (s != NULL)
4648 {
4649 printf ("%s\n", s);
4650 free (s);
4651 }
4652 else
4653 {
4654 #ifdef IN_GLIBCPP_V3
4655 fprintf (stderr, "Failed: %s (status %d)\n", argv[i], status);
4656 #else
4657 fprintf (stderr, "Failed: %s\n", argv[i]);
4658 #endif
4659 }
4660 }
4661 }
4662
4663 return 0;
4664 }
4665
4666 #endif /* STANDALONE_DEMANGLER */
This page took 0.128017 seconds and 3 git commands to generate.