6a2b311335ccee13d598f04ad2b5cd8d99aefb3b
[deliverable/binutils-gdb.git] / libiberty / cp-demangle.c
1 /* Demangler for g++ V3 ABI.
2 Copyright (C) 2003 Free Software Foundation, Inc.
3 Written by Ian Lance Taylor <ian@wasabisystems.com>.
4
5 This file is part of the libiberty library, which is part of GCC.
6
7 This file is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 In addition to the permissions in the GNU General Public License, the
13 Free Software Foundation gives you unlimited permission to link the
14 compiled version of this file into combinations with other programs,
15 and to distribute those combinations without any restriction coming
16 from the use of this file. (The General Public License restrictions
17 do apply in other respects; for example, they cover modification of
18 the file, and distribution when not linked into a combined
19 executable.)
20
21 This program is distributed in the hope that it will be useful,
22 but WITHOUT ANY WARRANTY; without even the implied warranty of
23 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 GNU General Public License for more details.
25
26 You should have received a copy of the GNU General Public License
27 along with this program; if not, write to the Free Software
28 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
29 */
30
31 #ifdef HAVE_CONFIG_H
32 #include "config.h"
33 #endif
34
35 #include <stdio.h>
36
37 #ifdef HAVE_STDLIB_H
38 #include <stdlib.h>
39 #endif
40 #ifdef HAVE_STRING_H
41 #include <string.h>
42 #endif
43
44 #include "ansidecl.h"
45 #include "libiberty.h"
46 #include "demangle.h"
47
48 /* This code implements a demangler for the g++ V3 ABI. The ABI is
49 described on this web page:
50 http://www.codesourcery.com/cxx-abi/abi.html#mangling
51
52 This code was written while looking at the demangler written by
53 Alex Samuel <samuel@codesourcery.com>.
54
55 This code first pulls the mangled name apart into a list of
56 components, and then walks the list generating the demangled
57 name. */
58
59 /* Avoid pulling in the ctype tables for this simple usage. */
60 #define IS_DIGIT(c) ((c) >= '0' && (c) <= '9')
61
62 /* The prefix prepended by GCC to an identifier represnting the
63 anonymous namespace. */
64 #define ANONYMOUS_NAMESPACE_PREFIX "_GLOBAL_"
65 #define ANONYMOUS_NAMESPACE_PREFIX_LEN \
66 (sizeof (ANONYMOUS_NAMESPACE_PREFIX) - 1)
67
68 /* Information we keep for operators. */
69
70 struct d_operator_info
71 {
72 /* Mangled name. */
73 const char *code;
74 /* Real name. */
75 const char *name;
76 /* Number of arguments. */
77 int args;
78 };
79
80 /* How to print the value of a builtin type. */
81
82 enum d_builtin_type_print
83 {
84 /* Print as (type)val. */
85 D_PRINT_DEFAULT,
86 /* Print as integer. */
87 D_PRINT_INT,
88 /* Print as long, with trailing `l'. */
89 D_PRINT_LONG,
90 /* Print as bool. */
91 D_PRINT_BOOL,
92 /* Print in usual way, but here to detect void. */
93 D_PRINT_VOID
94 };
95
96 /* Information we keep for a builtin type. */
97
98 struct d_builtin_type_info
99 {
100 /* Type name. */
101 const char *name;
102 /* Type name when using Java. */
103 const char *java_name;
104 /* How to print a value of this type. */
105 enum d_builtin_type_print print;
106 };
107
108 /* Component types found in mangled names. */
109
110 enum d_comp_type
111 {
112 /* A name. */
113 D_COMP_NAME,
114 /* A qualified name. */
115 D_COMP_QUAL_NAME,
116 /* A typed name. */
117 D_COMP_TYPED_NAME,
118 /* A template. */
119 D_COMP_TEMPLATE,
120 /* A template parameter. */
121 D_COMP_TEMPLATE_PARAM,
122 /* A constructor. */
123 D_COMP_CTOR,
124 /* A destructor. */
125 D_COMP_DTOR,
126 /* A vtable. */
127 D_COMP_VTABLE,
128 /* A VTT structure. */
129 D_COMP_VTT,
130 /* A construction vtable. */
131 D_COMP_CONSTRUCTION_VTABLE,
132 /* A typeinfo structure. */
133 D_COMP_TYPEINFO,
134 /* A typeinfo name. */
135 D_COMP_TYPEINFO_NAME,
136 /* A typeinfo function. */
137 D_COMP_TYPEINFO_FN,
138 /* A thunk. */
139 D_COMP_THUNK,
140 /* A virtual thunk. */
141 D_COMP_VIRTUAL_THUNK,
142 /* A covariant thunk. */
143 D_COMP_COVARIANT_THUNK,
144 /* A Java class. */
145 D_COMP_JAVA_CLASS,
146 /* A guard variable. */
147 D_COMP_GUARD,
148 /* A reference temporary. */
149 D_COMP_REFTEMP,
150 /* A standard substitution. */
151 D_COMP_SUB_STD,
152 /* The restrict qualifier. */
153 D_COMP_RESTRICT,
154 /* The volatile qualifier. */
155 D_COMP_VOLATILE,
156 /* The const qualifier. */
157 D_COMP_CONST,
158 /* A vendor qualifier. */
159 D_COMP_VENDOR_TYPE_QUAL,
160 /* A pointer. */
161 D_COMP_POINTER,
162 /* A reference. */
163 D_COMP_REFERENCE,
164 /* A complex type. */
165 D_COMP_COMPLEX,
166 /* An imaginary type. */
167 D_COMP_IMAGINARY,
168 /* A builtin type. */
169 D_COMP_BUILTIN_TYPE,
170 /* A vendor's builtin type. */
171 D_COMP_VENDOR_TYPE,
172 /* A function type. */
173 D_COMP_FUNCTION_TYPE,
174 /* An array type. */
175 D_COMP_ARRAY_TYPE,
176 /* A pointer to member type. */
177 D_COMP_PTRMEM_TYPE,
178 /* An argument list. */
179 D_COMP_ARGLIST,
180 /* A template argument list. */
181 D_COMP_TEMPLATE_ARGLIST,
182 /* An operator. */
183 D_COMP_OPERATOR,
184 /* An extended operator. */
185 D_COMP_EXTENDED_OPERATOR,
186 /* A typecast. */
187 D_COMP_CAST,
188 /* A unary expression. */
189 D_COMP_UNARY,
190 /* A binary expression. */
191 D_COMP_BINARY,
192 /* Arguments to a binary expression. */
193 D_COMP_BINARY_ARGS,
194 /* A trinary expression. */
195 D_COMP_TRINARY,
196 /* Arguments to a trinary expression. */
197 D_COMP_TRINARY_ARG1,
198 D_COMP_TRINARY_ARG2,
199 /* A literal. */
200 D_COMP_LITERAL
201 };
202
203 /* A component of the mangled name. */
204
205 struct d_comp
206 {
207 /* The type of this component. */
208 enum d_comp_type type;
209 union
210 {
211 /* For D_COMP_NAME. */
212 struct
213 {
214 /* A pointer to the name (not NULL terminated) and it's
215 length. */
216 const char *s;
217 int len;
218 } s_name;
219
220 /* For D_COMP_OPERATOR. */
221 struct
222 {
223 /* Operator. */
224 const struct d_operator_info *op;
225 } s_operator;
226
227 /* For D_COMP_EXTENDED_OPERATOR. */
228 struct
229 {
230 /* Number of arguments. */
231 int args;
232 /* Name. */
233 struct d_comp *name;
234 } s_extended_operator;
235
236 /* For D_COMP_CTOR. */
237 struct
238 {
239 enum gnu_v3_ctor_kinds kind;
240 struct d_comp *name;
241 } s_ctor;
242
243 /* For D_COMP_DTOR. */
244 struct
245 {
246 enum gnu_v3_dtor_kinds kind;
247 struct d_comp *name;
248 } s_dtor;
249
250 /* For D_COMP_BUILTIN_TYPE. */
251 struct
252 {
253 const struct d_builtin_type_info *type;
254 } s_builtin;
255
256 /* For D_COMP_SUB_STD. */
257 struct
258 {
259 const char* string;
260 } s_string;
261
262 /* For D_COMP_TEMPLATE_PARAM. */
263 struct
264 {
265 long number;
266 } s_number;
267
268 /* For other types. */
269 struct
270 {
271 struct d_comp *left;
272 struct d_comp *right;
273 } s_binary;
274
275 } u;
276 };
277
278 #define d_left(dc) ((dc)->u.s_binary.left)
279 #define d_right(dc) ((dc)->u.s_binary.right)
280
281 /* The information structure we pass around. */
282
283 struct d_info
284 {
285 /* The string we are demangling. */
286 const char *s;
287 /* The options passed to the demangler. */
288 int options;
289 /* The next character in the string to consider. */
290 const char *n;
291 /* The array of components. */
292 struct d_comp *comps;
293 /* The index of the next available component. */
294 int next_comp;
295 /* The number of available component structures. */
296 int num_comps;
297 /* The array of substitutions. */
298 struct d_comp **subs;
299 /* The index of the next substitution. */
300 int next_sub;
301 /* The number of available entries in the subs array. */
302 int num_subs;
303 /* The last name we saw, for constructors and destructors. */
304 struct d_comp *last_name;
305 };
306
307 #define d_peek_char(di) (*((di)->n))
308 #define d_peek_next_char(di) ((di)->n[1])
309 #define d_advance(di, i) ((di)->n += (i))
310 #define d_next_char(di) (*((di)->n++))
311 #define d_str(di) ((di)->n)
312
313 /* A list of templates. This is used while printing. */
314
315 struct d_print_template
316 {
317 /* Next template on the list. */
318 struct d_print_template *next;
319 /* This template. */
320 const struct d_comp *template;
321 };
322
323 /* A list of type modifiers. This is used while printing. */
324
325 struct d_print_mod
326 {
327 /* Next modifier on the list. These are in the reverse of the order
328 in which they appeared in the mangled string. */
329 struct d_print_mod *next;
330 /* The modifier. */
331 const struct d_comp *mod;
332 /* Whether this modifier was printed. */
333 int printed;
334 };
335
336 /* We use this structure to hold information during printing. */
337
338 struct d_print_info
339 {
340 /* The options passed to the demangler. */
341 int options;
342 /* Buffer holding the result. */
343 char *buf;
344 /* Current length of data in buffer. */
345 size_t len;
346 /* Allocated size of buffer. */
347 size_t alc;
348 /* The current list of templates, if any. */
349 struct d_print_template *templates;
350 /* The current list of modifiers (e.g., pointer, reference, etc.),
351 if any. */
352 struct d_print_mod *modifiers;
353 /* Set to 1 if we had a memory allocation failure. */
354 int allocation_failure;
355 };
356
357 #define d_print_saw_error(dpi) ((dpi)->buf == NULL)
358
359 #define d_append_char(dpi, c) \
360 do \
361 { \
362 if ((dpi)->buf != NULL && (dpi)->len < (dpi)->alc) \
363 (dpi)->buf[(dpi)->len++] = (c); \
364 else \
365 d_print_append_char ((dpi), (c)); \
366 } \
367 while (0)
368
369 #define d_append_buffer(dpi, s, l) \
370 do \
371 { \
372 if ((dpi)->buf != NULL && (dpi)->len + (l) <= (dpi)->alc) \
373 { \
374 memcpy ((dpi)->buf + (dpi)->len, (s), (l)); \
375 (dpi)->len += l; \
376 } \
377 else \
378 d_print_append_buffer ((dpi), (s), (l)); \
379 } \
380 while (0)
381
382 #define d_append_string(dpi, s) \
383 do \
384 { \
385 size_t d_append_string_len = strlen (s); \
386 d_append_buffer ((dpi), (s), d_append_string_len); \
387 } \
388 while (0)
389
390 #ifdef CP_DEMANGLE_DEBUG
391 static void d_dump PARAMS ((struct d_comp *, int));
392 #endif
393 static struct d_comp *d_make_empty PARAMS ((struct d_info *,
394 enum d_comp_type));
395 static struct d_comp *d_make_comp PARAMS ((struct d_info *, enum d_comp_type,
396 struct d_comp *, struct d_comp *));
397 static struct d_comp *d_make_name PARAMS ((struct d_info *, const char *,
398 int));
399 static struct d_comp *d_make_builtin_type PARAMS ((struct d_info *,
400 const struct d_builtin_type_info *));
401 static struct d_comp *d_make_operator PARAMS ((struct d_info *,
402 const struct d_operator_info *));
403 static struct d_comp *d_make_extended_operator PARAMS ((struct d_info *,
404 int,
405 struct d_comp *));
406 static struct d_comp *d_make_ctor PARAMS ((struct d_info *,
407 enum gnu_v3_ctor_kinds,
408 struct d_comp *));
409 static struct d_comp *d_make_dtor PARAMS ((struct d_info *,
410 enum gnu_v3_dtor_kinds,
411 struct d_comp *));
412 static struct d_comp *d_make_template_param PARAMS ((struct d_info *, long));
413 static struct d_comp *d_make_sub PARAMS ((struct d_info *, const char *));
414 static struct d_comp *d_mangled_name PARAMS ((struct d_info *));
415 static int has_return_type PARAMS ((struct d_comp *));
416 static int is_ctor_dtor_or_conversion PARAMS ((struct d_comp *));
417 static struct d_comp *d_encoding PARAMS ((struct d_info *));
418 static struct d_comp *d_name PARAMS ((struct d_info *));
419 static struct d_comp *d_nested_name PARAMS ((struct d_info *));
420 static struct d_comp *d_prefix PARAMS ((struct d_info *));
421 static struct d_comp *d_unqualified_name PARAMS ((struct d_info *));
422 static struct d_comp *d_source_name PARAMS ((struct d_info *));
423 static long d_number PARAMS ((struct d_info *));
424 static struct d_comp *d_identifier PARAMS ((struct d_info *, int));
425 static struct d_comp *d_operator_name PARAMS ((struct d_info *));
426 static struct d_comp *d_special_name PARAMS ((struct d_info *));
427 static int d_call_offset PARAMS ((struct d_info *, int));
428 static struct d_comp *d_ctor_dtor_name PARAMS ((struct d_info *));
429 static struct d_comp *d_type PARAMS ((struct d_info *));
430 static struct d_comp **d_cv_qualifiers PARAMS ((struct d_info *,
431 struct d_comp **));
432 static struct d_comp *d_function_type PARAMS ((struct d_info *));
433 static struct d_comp *d_bare_function_type PARAMS ((struct d_info *, int));
434 static struct d_comp *d_class_enum_type PARAMS ((struct d_info *));
435 static struct d_comp *d_array_type PARAMS ((struct d_info *));
436 static struct d_comp *d_pointer_to_member_type PARAMS ((struct d_info *));
437 static struct d_comp *d_template_param PARAMS ((struct d_info *));
438 static struct d_comp *d_template_args PARAMS ((struct d_info *));
439 static struct d_comp *d_template_arg PARAMS ((struct d_info *));
440 static struct d_comp *d_expression PARAMS ((struct d_info *));
441 static struct d_comp *d_expr_primary PARAMS ((struct d_info *));
442 static struct d_comp *d_local_name PARAMS ((struct d_info *));
443 static int d_discriminator PARAMS ((struct d_info *));
444 static int d_add_substitution PARAMS ((struct d_info *, struct d_comp *));
445 static struct d_comp *d_substitution PARAMS ((struct d_info *));
446 static void d_print_resize PARAMS ((struct d_print_info *, size_t));
447 static void d_print_append_char PARAMS ((struct d_print_info *, int));
448 static void d_print_append_buffer PARAMS ((struct d_print_info *, const char *,
449 size_t));
450 static void d_print_error PARAMS ((struct d_print_info *));
451 static char *d_print PARAMS ((int, const struct d_comp *, size_t *));
452 static void d_print_comp PARAMS ((struct d_print_info *,
453 const struct d_comp *));
454 static void d_print_identifier PARAMS ((struct d_print_info *, const char *,
455 int));
456 static void d_print_mod_list PARAMS ((struct d_print_info *,
457 struct d_print_mod *));
458 static void d_print_mod PARAMS ((struct d_print_info *,
459 const struct d_comp *));
460 static void d_print_function_type PARAMS ((struct d_print_info *,
461 const struct d_comp *,
462 struct d_print_mod *));
463 static void d_print_array_type PARAMS ((struct d_print_info *,
464 const struct d_comp *,
465 struct d_print_mod *));
466 static void d_print_expr_op PARAMS ((struct d_print_info *,
467 const struct d_comp *));
468 static void d_print_cast PARAMS ((struct d_print_info *,
469 const struct d_comp *));
470 static int d_init_info PARAMS ((const char *, int, size_t, struct d_info *));
471 static char *d_demangle PARAMS ((const char *, int, size_t *));
472
473 #ifdef CP_DEMANGLE_DEBUG
474
475 static void
476 d_dump (dc, indent)
477 struct d_comp *dc;
478 int indent;
479 {
480 int i;
481
482 if (dc == NULL)
483 return;
484
485 for (i = 0; i < indent; ++i)
486 putchar (' ');
487
488 switch (dc->type)
489 {
490 case D_COMP_NAME:
491 printf ("name '%.*s'\n", dc->u.s_name.len, dc->u.s_name.s);
492 return;
493 case D_COMP_TEMPLATE_PARAM:
494 printf ("template parameter %ld\n", dc->u.s_number.number);
495 return;
496 case D_COMP_CTOR:
497 printf ("constructor %d\n", (int) dc->u.s_ctor.kind);
498 d_dump (dc->u.s_ctor.name, indent + 2);
499 return;
500 case D_COMP_DTOR:
501 printf ("destructor %d\n", (int) dc->u.s_dtor.kind);
502 d_dump (dc->u.s_dtor.name, indent + 2);
503 return;
504 case D_COMP_SUB_STD:
505 printf ("standard substitution %s\n", dc->u.s_string.string);
506 return;
507 case D_COMP_BUILTIN_TYPE:
508 printf ("builtin type %s\n", dc->u.s_builtin.type->name);
509 return;
510 case D_COMP_OPERATOR:
511 printf ("operator %s\n", dc->u.s_operator.op->name);
512 return;
513 case D_COMP_EXTENDED_OPERATOR:
514 printf ("extended operator with %d args\n",
515 dc->u.s_extended_operator.args);
516 d_dump (dc->u.s_extended_operator.name, indent + 2);
517 return;
518
519 case D_COMP_QUAL_NAME:
520 printf ("qualified name\n");
521 break;
522 case D_COMP_TYPED_NAME:
523 printf ("typed name\n");
524 break;
525 case D_COMP_TEMPLATE:
526 printf ("template\n");
527 break;
528 case D_COMP_VTABLE:
529 printf ("vtable\n");
530 break;
531 case D_COMP_VTT:
532 printf ("VTT\n");
533 break;
534 case D_COMP_CONSTRUCTION_VTABLE:
535 printf ("construction vtable\n");
536 break;
537 case D_COMP_TYPEINFO:
538 printf ("typeinfo\n");
539 break;
540 case D_COMP_TYPEINFO_NAME:
541 printf ("typeinfo name\n");
542 break;
543 case D_COMP_TYPEINFO_FN:
544 printf ("typeinfo function\n");
545 break;
546 case D_COMP_THUNK:
547 printf ("thunk\n");
548 break;
549 case D_COMP_VIRTUAL_THUNK:
550 printf ("virtual thunk\n");
551 break;
552 case D_COMP_COVARIANT_THUNK:
553 printf ("covariant thunk\n");
554 break;
555 case D_COMP_JAVA_CLASS:
556 printf ("java class\n");
557 break;
558 case D_COMP_GUARD:
559 printf ("guard\n");
560 break;
561 case D_COMP_REFTEMP:
562 printf ("reference temporary\n");
563 break;
564 case D_COMP_RESTRICT:
565 printf ("restrict\n");
566 break;
567 case D_COMP_VOLATILE:
568 printf ("volatile\n");
569 break;
570 case D_COMP_CONST:
571 printf ("const\n");
572 break;
573 case D_COMP_VENDOR_TYPE_QUAL:
574 printf ("vendor type qualifier\n");
575 break;
576 case D_COMP_POINTER:
577 printf ("pointer\n");
578 break;
579 case D_COMP_REFERENCE:
580 printf ("reference\n");
581 break;
582 case D_COMP_COMPLEX:
583 printf ("complex\n");
584 break;
585 case D_COMP_IMAGINARY:
586 printf ("imaginary\n");
587 break;
588 case D_COMP_VENDOR_TYPE:
589 printf ("vendor type\n");
590 break;
591 case D_COMP_FUNCTION_TYPE:
592 printf ("function type\n");
593 break;
594 case D_COMP_ARRAY_TYPE:
595 printf ("array type\n");
596 break;
597 case D_COMP_PTRMEM_TYPE:
598 printf ("pointer to member type\n");
599 break;
600 case D_COMP_ARGLIST:
601 printf ("argument list\n");
602 break;
603 case D_COMP_TEMPLATE_ARGLIST:
604 printf ("template argument list\n");
605 break;
606 case D_COMP_CAST:
607 printf ("cast\n");
608 break;
609 case D_COMP_UNARY:
610 printf ("unary operator\n");
611 break;
612 case D_COMP_BINARY:
613 printf ("binary operator\n");
614 break;
615 case D_COMP_BINARY_ARGS:
616 printf ("binary operator arguments\n");
617 break;
618 case D_COMP_TRINARY:
619 printf ("trinary operator\n");
620 break;
621 case D_COMP_TRINARY_ARG1:
622 printf ("trinary operator arguments 1\n");
623 break;
624 case D_COMP_TRINARY_ARG2:
625 printf ("trinary operator arguments 1\n");
626 break;
627 case D_COMP_LITERAL:
628 printf ("literal\n");
629 break;
630 }
631
632 d_dump (d_left (dc), indent + 2);
633 d_dump (d_right (dc), indent + 2);
634 }
635
636 #endif /* CP_DEMANGLE_DEBUG */
637
638 /* Add a new component. */
639
640 static struct d_comp *
641 d_make_empty (di, type)
642 struct d_info *di;
643 enum d_comp_type type;
644 {
645 struct d_comp *p;
646
647 if (di->next_comp >= di->num_comps)
648 return NULL;
649 p = &di->comps[di->next_comp];
650 p->type = type;
651 ++di->next_comp;
652 return p;
653 }
654
655 /* Add a new generic component. */
656
657 static struct d_comp *
658 d_make_comp (di, type, left, right)
659 struct d_info *di;
660 enum d_comp_type type;
661 struct d_comp *left;
662 struct d_comp *right;
663 {
664 struct d_comp *p;
665
666 /* We check for errors here. A typical error would be a NULL return
667 from a subroutine. We catch here, and return NULL on upward. */
668 switch (type)
669 {
670 /* These types require two parameters. */
671 case D_COMP_QUAL_NAME:
672 case D_COMP_TYPED_NAME:
673 case D_COMP_TEMPLATE:
674 case D_COMP_VENDOR_TYPE_QUAL:
675 case D_COMP_PTRMEM_TYPE:
676 case D_COMP_UNARY:
677 case D_COMP_BINARY:
678 case D_COMP_BINARY_ARGS:
679 case D_COMP_TRINARY:
680 case D_COMP_TRINARY_ARG1:
681 case D_COMP_TRINARY_ARG2:
682 case D_COMP_LITERAL:
683 if (left == NULL || right == NULL)
684 return NULL;
685 break;
686
687 /* These types only require one parameter. */
688 case D_COMP_VTABLE:
689 case D_COMP_VTT:
690 case D_COMP_CONSTRUCTION_VTABLE:
691 case D_COMP_TYPEINFO:
692 case D_COMP_TYPEINFO_NAME:
693 case D_COMP_TYPEINFO_FN:
694 case D_COMP_THUNK:
695 case D_COMP_VIRTUAL_THUNK:
696 case D_COMP_COVARIANT_THUNK:
697 case D_COMP_JAVA_CLASS:
698 case D_COMP_GUARD:
699 case D_COMP_REFTEMP:
700 case D_COMP_POINTER:
701 case D_COMP_REFERENCE:
702 case D_COMP_COMPLEX:
703 case D_COMP_IMAGINARY:
704 case D_COMP_VENDOR_TYPE:
705 case D_COMP_ARGLIST:
706 case D_COMP_TEMPLATE_ARGLIST:
707 case D_COMP_CAST:
708 if (left == NULL)
709 return NULL;
710 break;
711
712 /* This needs a right parameter, but the left parameter can be
713 empty. */
714 case D_COMP_ARRAY_TYPE:
715 if (right == NULL)
716 return NULL;
717 break;
718
719 /* These are allowed to have no parameters--in some cases they
720 will be filled in later. */
721 case D_COMP_FUNCTION_TYPE:
722 case D_COMP_RESTRICT:
723 case D_COMP_VOLATILE:
724 case D_COMP_CONST:
725 break;
726
727 /* Other types should not be seen here. */
728 default:
729 return NULL;
730 }
731
732 p = d_make_empty (di, type);
733 if (p != NULL)
734 {
735 p->u.s_binary.left = left;
736 p->u.s_binary.right = right;
737 }
738 return p;
739 }
740
741 /* Add a new name component. */
742
743 static struct d_comp *
744 d_make_name (di, s, len)
745 struct d_info *di;
746 const char *s;
747 int len;
748 {
749 struct d_comp *p;
750
751 p = d_make_empty (di, D_COMP_NAME);
752 if (p != NULL)
753 {
754 p->u.s_name.s = s;
755 p->u.s_name.len = len;
756 }
757 return p;
758 }
759
760 /* Add a new builtin type component. */
761
762 static struct d_comp *
763 d_make_builtin_type (di, type)
764 struct d_info *di;
765 const struct d_builtin_type_info *type;
766 {
767 struct d_comp *p;
768
769 p = d_make_empty (di, D_COMP_BUILTIN_TYPE);
770 if (p != NULL)
771 p->u.s_builtin.type = type;
772 return p;
773 }
774
775 /* Add a new operator component. */
776
777 static struct d_comp *
778 d_make_operator (di, op)
779 struct d_info *di;
780 const struct d_operator_info *op;
781 {
782 struct d_comp *p;
783
784 p = d_make_empty (di, D_COMP_OPERATOR);
785 if (p != NULL)
786 p->u.s_operator.op = op;
787 return p;
788 }
789
790 /* Add a new extended operator component. */
791
792 static struct d_comp *
793 d_make_extended_operator (di, args, name)
794 struct d_info *di;
795 int args;
796 struct d_comp *name;
797 {
798 struct d_comp *p;
799
800 p = d_make_empty (di, D_COMP_EXTENDED_OPERATOR);
801 if (p != NULL)
802 {
803 p->u.s_extended_operator.args = args;
804 p->u.s_extended_operator.name = name;
805 }
806 return p;
807 }
808
809 /* Add a new constructor component. */
810
811 static struct d_comp *
812 d_make_ctor (di, kind, name)
813 struct d_info *di;
814 enum gnu_v3_ctor_kinds kind;
815 struct d_comp *name;
816 {
817 struct d_comp *p;
818
819 p = d_make_empty (di, D_COMP_CTOR);
820 if (p != NULL)
821 {
822 p->u.s_ctor.kind = kind;
823 p->u.s_ctor.name = name;
824 }
825 return p;
826 }
827
828 /* Add a new destructor component. */
829
830 static struct d_comp *
831 d_make_dtor (di, kind, name)
832 struct d_info *di;
833 enum gnu_v3_dtor_kinds kind;
834 struct d_comp *name;
835 {
836 struct d_comp *p;
837
838 p = d_make_empty (di, D_COMP_DTOR);
839 if (p != NULL)
840 {
841 p->u.s_dtor.kind = kind;
842 p->u.s_dtor.name = name;
843 }
844 return p;
845 }
846
847 /* Add a new template parameter. */
848
849 static struct d_comp *
850 d_make_template_param (di, i)
851 struct d_info *di;
852 long i;
853 {
854 struct d_comp *p;
855
856 p = d_make_empty (di, D_COMP_TEMPLATE_PARAM);
857 if (p != NULL)
858 p->u.s_number.number = i;
859 return p;
860 }
861
862 /* Add a new standard substitution component. */
863
864 static struct d_comp *
865 d_make_sub (di, name)
866 struct d_info *di;
867 const char *name;
868 {
869 struct d_comp *p;
870
871 p = d_make_empty (di, D_COMP_SUB_STD);
872 if (p != NULL)
873 p->u.s_string.string = name;
874 return p;
875 }
876
877 /* <mangled-name> ::= _Z <encoding> */
878
879 static struct d_comp *
880 d_mangled_name (di)
881 struct d_info *di;
882 {
883 if (d_next_char (di) != '_')
884 return NULL;
885 if (d_next_char (di) != 'Z')
886 return NULL;
887 return d_encoding (di);
888 }
889
890 /* Return whether a function should have a return type. The argument
891 is the function name, which may be qualified in various ways. The
892 rules are that template functions have return types with some
893 exceptions, function types which are not part of a function name
894 mangling have return types with some exceptions, and non-template
895 function names do not have return types. The exceptions are that
896 constructors, destructors, and conversion operators do not have
897 return types. */
898
899 static int
900 has_return_type (dc)
901 struct d_comp *dc;
902 {
903 if (dc == NULL)
904 return 0;
905 switch (dc->type)
906 {
907 default:
908 return 0;
909 case D_COMP_TEMPLATE:
910 return ! is_ctor_dtor_or_conversion (d_left (dc));
911 }
912 }
913
914 /* Return whether a name is a constructor, a destructor, or a
915 conversion operator. */
916
917 static int
918 is_ctor_dtor_or_conversion (dc)
919 struct d_comp *dc;
920 {
921 if (dc == NULL)
922 return 0;
923 switch (dc->type)
924 {
925 default:
926 return 0;
927 case D_COMP_QUAL_NAME:
928 return is_ctor_dtor_or_conversion (d_right (dc));
929 case D_COMP_CTOR:
930 case D_COMP_DTOR:
931 case D_COMP_CAST:
932 return 1;
933 }
934 }
935
936 /* <encoding> ::= <(function) name> <bare-function-type>
937 ::= <(data) name>
938 ::= <special-name> */
939
940 static struct d_comp *
941 d_encoding (di)
942 struct d_info *di;
943 {
944 char peek = d_peek_char (di);
945
946 if (peek == 'G' || peek == 'T')
947 return d_special_name (di);
948 else
949 {
950 struct d_comp *dc;
951
952 dc = d_name (di);
953 peek = d_peek_char (di);
954 if (peek == '\0' || peek == 'E')
955 return dc;
956 return d_make_comp (di, D_COMP_TYPED_NAME, dc,
957 d_bare_function_type (di, has_return_type (dc)));
958 }
959 }
960
961 /* <name> ::= <nested-name>
962 ::= <unscoped-name>
963 ::= <unscoped-template-name> <template-args>
964 ::= <local-name>
965
966 <unscoped-name> ::= <unqualified-name>
967 ::= St <unqualified-name>
968
969 <unscoped-template-name> ::= <unscoped-name>
970 ::= <substitution>
971 */
972
973 static struct d_comp *
974 d_name (di)
975 struct d_info *di;
976 {
977 char peek = d_peek_char (di);
978 struct d_comp *dc;
979
980 switch (peek)
981 {
982 case 'N':
983 return d_nested_name (di);
984
985 case 'Z':
986 return d_local_name (di);
987
988 case 'S':
989 {
990 int subst;
991
992 if (d_peek_next_char (di) != 't')
993 {
994 dc = d_substitution (di);
995 subst = 1;
996 }
997 else
998 {
999 d_advance (di, 2);
1000 dc = d_make_comp (di, D_COMP_QUAL_NAME, d_make_name (di, "std", 3),
1001 d_unqualified_name (di));
1002 subst = 0;
1003 }
1004
1005 if (d_peek_char (di) != 'I')
1006 {
1007 /* The grammar does not permit this case to occur if we
1008 called d_substitution() above (i.e., subst == 1). We
1009 don't bother to check. */
1010 }
1011 else
1012 {
1013 /* This is <template-args>, which means that we just saw
1014 <unscoped-template-name>, which is a substitution
1015 candidate if we didn't just get it from a
1016 substitution. */
1017 if (! subst)
1018 {
1019 if (! d_add_substitution (di, dc))
1020 return NULL;
1021 }
1022 dc = d_make_comp (di, D_COMP_TEMPLATE, dc, d_template_args (di));
1023 }
1024
1025 return dc;
1026 }
1027
1028 default:
1029 dc = d_unqualified_name (di);
1030 if (d_peek_char (di) == 'I')
1031 {
1032 /* This is <template-args>, which means that we just saw
1033 <unscoped-template-name>, which is a substitution
1034 candidate. */
1035 if (! d_add_substitution (di, dc))
1036 return NULL;
1037 dc = d_make_comp (di, D_COMP_TEMPLATE, dc, d_template_args (di));
1038 }
1039 return dc;
1040 }
1041 }
1042
1043 /* <nested-name> ::= N [<CV-qualifiers>] <prefix> <unqualified-name> E
1044 ::= N [<CV-qualifiers>] <template-prefix> <template-args> E
1045 */
1046
1047 static struct d_comp *
1048 d_nested_name (di)
1049 struct d_info *di;
1050 {
1051 struct d_comp *ret;
1052 struct d_comp **pret;
1053
1054 if (d_next_char (di) != 'N')
1055 return NULL;
1056
1057 pret = d_cv_qualifiers (di, &ret);
1058 if (pret == NULL)
1059 return NULL;
1060
1061 *pret = d_prefix (di);
1062 if (*pret == NULL)
1063 return NULL;
1064
1065 if (d_next_char (di) != 'E')
1066 return NULL;
1067
1068 return ret;
1069 }
1070
1071 /* <prefix> ::= <prefix> <unqualified-name>
1072 ::= <template-prefix> <template-args>
1073 ::= <template-param>
1074 ::=
1075 ::= <substitution>
1076
1077 <template-prefix> ::= <prefix> <(template) unqualified-name>
1078 ::= <template-param>
1079 ::= <substitution>
1080 */
1081
1082 static struct d_comp *
1083 d_prefix (di)
1084 struct d_info *di;
1085 {
1086 struct d_comp *ret = NULL;
1087
1088 while (1)
1089 {
1090 char peek;
1091 enum d_comp_type comb_type;
1092 struct d_comp *dc;
1093
1094 peek = d_peek_char (di);
1095 if (peek == '\0')
1096 return NULL;
1097
1098 /* The older code accepts a <local-name> here, but I don't see
1099 that in the grammar. The older code does not accept a
1100 <template-param> here. */
1101
1102 comb_type = D_COMP_QUAL_NAME;
1103 if (IS_DIGIT (peek)
1104 || (peek >= 'a' && peek <= 'z')
1105 || peek == 'C'
1106 || peek == 'D')
1107 dc = d_unqualified_name (di);
1108 else if (peek == 'S')
1109 dc = d_substitution (di);
1110 else if (peek == 'I')
1111 {
1112 if (ret == NULL)
1113 return NULL;
1114 comb_type = D_COMP_TEMPLATE;
1115 dc = d_template_args (di);
1116 }
1117 else if (peek == 'T')
1118 dc = d_template_param (di);
1119 else if (peek == 'E')
1120 return ret;
1121 else
1122 return NULL;
1123
1124 if (ret == NULL)
1125 ret = dc;
1126 else
1127 ret = d_make_comp (di, comb_type, ret, dc);
1128
1129 if (peek != 'S' && d_peek_char (di) != 'E')
1130 {
1131 if (! d_add_substitution (di, ret))
1132 return NULL;
1133 }
1134 }
1135 }
1136
1137 /* <unqualified-name> ::= <operator-name>
1138 ::= <ctor-dtor-name>
1139 ::= <source-name>
1140 */
1141
1142 static struct d_comp *
1143 d_unqualified_name (di)
1144 struct d_info *di;
1145 {
1146 char peek;
1147
1148 peek = d_peek_char (di);
1149 if (IS_DIGIT (peek))
1150 return d_source_name (di);
1151 else if (peek >= 'a' && peek <= 'z')
1152 return d_operator_name (di);
1153 else if (peek == 'C' || peek == 'D')
1154 return d_ctor_dtor_name (di);
1155 else
1156 return NULL;
1157 }
1158
1159 /* <source-name> ::= <(positive length) number> <identifier> */
1160
1161 static struct d_comp *
1162 d_source_name (di)
1163 struct d_info *di;
1164 {
1165 long len;
1166 struct d_comp *ret;
1167
1168 len = d_number (di);
1169 if (len <= 0)
1170 return NULL;
1171 ret = d_identifier (di, len);
1172 di->last_name = ret;
1173 return ret;
1174 }
1175
1176 /* number ::= [n] <(non-negative decimal integer)> */
1177
1178 static long
1179 d_number (di)
1180 struct d_info *di;
1181 {
1182 int sign;
1183 char peek;
1184 long ret;
1185
1186 sign = 1;
1187 peek = d_peek_char (di);
1188 if (peek == 'n')
1189 {
1190 sign = -1;
1191 d_advance (di, 1);
1192 peek = d_peek_char (di);
1193 }
1194
1195 ret = 0;
1196 while (1)
1197 {
1198 if (! IS_DIGIT (peek))
1199 return ret * sign;
1200 ret = ret * 10 + peek - '0';
1201 d_advance (di, 1);
1202 peek = d_peek_char (di);
1203 }
1204 }
1205
1206 /* identifier ::= <(unqualified source code identifier)> */
1207
1208 static struct d_comp *
1209 d_identifier (di, len)
1210 struct d_info *di;
1211 int len;
1212 {
1213 const char *name;
1214
1215 name = d_str (di);
1216 d_advance (di, len);
1217
1218 /* Look for something which looks like a gcc encoding of an
1219 anonymous namespace, and replace it with a more user friendly
1220 name. */
1221 if (len >= (int) ANONYMOUS_NAMESPACE_PREFIX_LEN + 2
1222 && memcmp (name, ANONYMOUS_NAMESPACE_PREFIX,
1223 ANONYMOUS_NAMESPACE_PREFIX_LEN) == 0)
1224 {
1225 const char *s;
1226
1227 s = name + ANONYMOUS_NAMESPACE_PREFIX_LEN;
1228 if ((*s == '.' || *s == '_' || *s == '$')
1229 && s[1] == 'N')
1230 return d_make_name (di, "(anonymous namespace)",
1231 sizeof "(anonymous namespace)" - 1);
1232 }
1233
1234 return d_make_name (di, name, len);
1235 }
1236
1237 /* operator_name ::= many different two character encodings.
1238 ::= cv <type>
1239 ::= v <digit> <source-name>
1240 */
1241
1242 static const struct d_operator_info d_operators[] =
1243 {
1244 { "aN", "&=", 2 },
1245 { "aS", "=", 2 },
1246 { "aa", "&&", 2 },
1247 { "ad", "&", 1 },
1248 { "an", "&", 2 },
1249 { "cl", "()", 0 },
1250 { "cm", ",", 2 },
1251 { "co", "~", 1 },
1252 { "dV", "/=", 2 },
1253 { "da", "delete[]", 1 },
1254 { "de", "*", 1 },
1255 { "dl", "delete", 1 },
1256 { "dv", "/", 2 },
1257 { "eO", "^=", 2 },
1258 { "eo", "^", 2 },
1259 { "eq", "==", 2 },
1260 { "ge", ">=", 2 },
1261 { "gt", ">", 2 },
1262 { "ix", "[]", 2 },
1263 { "lS", "<<=", 2 },
1264 { "le", "<=", 2 },
1265 { "ls", "<<", 2 },
1266 { "lt", "<", 2 },
1267 { "mI", "-=", 2 },
1268 { "mL", "*=", 2 },
1269 { "mi", "-", 2 },
1270 { "ml", "*", 2 },
1271 { "mm", "--", 1 },
1272 { "na", "new[]", 1 },
1273 { "ne", "!=", 2 },
1274 { "ng", "-", 1 },
1275 { "nt", "!", 1 },
1276 { "nw", "new", 1 },
1277 { "oR", "|=", 2 },
1278 { "oo", "||", 2 },
1279 { "or", "|", 2 },
1280 { "pL", "+=", 2 },
1281 { "pl", "+", 2 },
1282 { "pm", "->*", 2 },
1283 { "pp", "++", 1 },
1284 { "ps", "+", 1 },
1285 { "pt", "->", 2 },
1286 { "qu", "?", 3 },
1287 { "rM", "%=", 2 },
1288 { "rS", ">>=", 2 },
1289 { "rm", "%", 2 },
1290 { "rs", ">>", 2 },
1291 { "st", "sizeof ", 1 },
1292 { "sz", "sizeof ", 1 }
1293 };
1294
1295 static struct d_comp *
1296 d_operator_name (di)
1297 struct d_info *di;
1298 {
1299 char c1;
1300 char c2;
1301
1302 c1 = d_next_char (di);
1303 c2 = d_next_char (di);
1304 if (c1 == 'v' && IS_DIGIT (c2))
1305 return d_make_extended_operator (di, c2 - '0', d_source_name (di));
1306 else if (c1 == 'c' && c2 == 'v')
1307 return d_make_comp (di, D_COMP_CAST, d_type (di), NULL);
1308 else
1309 {
1310 int low = 0;
1311 int high = sizeof (d_operators) / sizeof (d_operators[0]);
1312
1313 while (1)
1314 {
1315 int i;
1316 const struct d_operator_info *p;
1317
1318 i = low + (high - low) / 2;
1319 p = d_operators + i;
1320
1321 if (c1 == p->code[0] && c2 == p->code[1])
1322 return d_make_operator (di, p);
1323
1324 if (c1 < p->code[0] || (c1 == p->code[0] && c2 < p->code[1]))
1325 high = i;
1326 else
1327 low = i + 1;
1328 if (low == high)
1329 return NULL;
1330 }
1331 }
1332 }
1333
1334 /* <special-name> ::= TV <type>
1335 ::= TT <type>
1336 ::= TI <type>
1337 ::= TS <type>
1338 ::= GV <(object) name>
1339 ::= T <call-offset> <(base) encoding>
1340 ::= Tc <call-offset> <call-offset> <(base) encoding>
1341 Also g++ extensions:
1342 ::= TC <type> <(offset) number> _ <(base) type>
1343 ::= TF <type>
1344 ::= TJ <type>
1345 ::= GR <name>
1346 */
1347
1348 static struct d_comp *
1349 d_special_name (di)
1350 struct d_info *di;
1351 {
1352 char c;
1353
1354 c = d_next_char (di);
1355 if (c == 'T')
1356 {
1357 switch (d_next_char (di))
1358 {
1359 case 'V':
1360 return d_make_comp (di, D_COMP_VTABLE, d_type (di), NULL);
1361 case 'T':
1362 return d_make_comp (di, D_COMP_VTT, d_type (di), NULL);
1363 case 'I':
1364 return d_make_comp (di, D_COMP_TYPEINFO, d_type (di), NULL);
1365 case 'S':
1366 return d_make_comp (di, D_COMP_TYPEINFO_NAME, d_type (di), NULL);
1367
1368 case 'h':
1369 if (! d_call_offset (di, 'h'))
1370 return NULL;
1371 return d_make_comp (di, D_COMP_THUNK, d_encoding (di), NULL);
1372
1373 case 'v':
1374 if (! d_call_offset (di, 'v'))
1375 return NULL;
1376 return d_make_comp (di, D_COMP_VIRTUAL_THUNK, d_encoding (di),
1377 NULL);
1378
1379 case 'c':
1380 if (! d_call_offset (di, '\0'))
1381 return NULL;
1382 if (! d_call_offset (di, '\0'))
1383 return NULL;
1384 return d_make_comp (di, D_COMP_COVARIANT_THUNK, d_encoding (di),
1385 NULL);
1386
1387 case 'C':
1388 {
1389 struct d_comp *derived_type;
1390 long offset;
1391 struct d_comp *base_type;
1392
1393 derived_type = d_type (di);
1394 offset = d_number (di);
1395 if (offset < 0)
1396 return NULL;
1397 if (d_next_char (di) != '_')
1398 return NULL;
1399 base_type = d_type (di);
1400 /* We don't display the offset. FIXME: We should display
1401 it in verbose mode. */
1402 return d_make_comp (di, D_COMP_CONSTRUCTION_VTABLE, base_type,
1403 derived_type);
1404 }
1405
1406 case 'F':
1407 return d_make_comp (di, D_COMP_TYPEINFO_FN, d_type (di), NULL);
1408 case 'J':
1409 return d_make_comp (di, D_COMP_JAVA_CLASS, d_type (di), NULL);
1410
1411 default:
1412 return NULL;
1413 }
1414 }
1415 else if (c == 'G')
1416 {
1417 switch (d_next_char (di))
1418 {
1419 case 'V':
1420 return d_make_comp (di, D_COMP_GUARD, d_name (di), NULL);
1421
1422 case 'R':
1423 return d_make_comp (di, D_COMP_REFTEMP, d_name (di), NULL);
1424
1425 default:
1426 return NULL;
1427 }
1428 }
1429 else
1430 return NULL;
1431 }
1432
1433 /* <call-offset> ::= h <nv-offset> _
1434 ::= v <v-offset> _
1435
1436 <nv-offset> ::= <(offset) number>
1437
1438 <v-offset> ::= <(offset) number> _ <(virtual offset) number>
1439
1440 The C parameter, if not '\0', is a character we just read which is
1441 the start of the <call-offset>.
1442
1443 We don't display the offset information anywhere. FIXME: We should
1444 display it in verbose mode. */
1445
1446 static int
1447 d_call_offset (di, c)
1448 struct d_info *di;
1449 int c;
1450 {
1451 long offset;
1452 long virtual_offset;
1453
1454 if (c == '\0')
1455 c = d_next_char (di);
1456
1457 if (c == 'h')
1458 offset = d_number (di);
1459 else if (c == 'v')
1460 {
1461 offset = d_number (di);
1462 if (d_next_char (di) != '_')
1463 return 0;
1464 virtual_offset = d_number (di);
1465 }
1466 else
1467 return 0;
1468
1469 if (d_next_char (di) != '_')
1470 return 0;
1471
1472 return 1;
1473 }
1474
1475 /* <ctor-dtor-name> ::= C1
1476 ::= C2
1477 ::= C3
1478 ::= D0
1479 ::= D1
1480 ::= D2
1481 */
1482
1483 static struct d_comp *
1484 d_ctor_dtor_name (di)
1485 struct d_info *di;
1486 {
1487 switch (d_next_char (di))
1488 {
1489 case 'C':
1490 {
1491 enum gnu_v3_ctor_kinds kind;
1492
1493 switch (d_next_char (di))
1494 {
1495 case '1':
1496 kind = gnu_v3_complete_object_ctor;
1497 break;
1498 case '2':
1499 kind = gnu_v3_base_object_ctor;
1500 break;
1501 case '3':
1502 kind = gnu_v3_complete_object_allocating_ctor;
1503 break;
1504 default:
1505 return NULL;
1506 }
1507 return d_make_ctor (di, kind, di->last_name);
1508 }
1509
1510 case 'D':
1511 {
1512 enum gnu_v3_dtor_kinds kind;
1513
1514 switch (d_next_char (di))
1515 {
1516 case '0':
1517 kind = gnu_v3_deleting_dtor;
1518 break;
1519 case '1':
1520 kind = gnu_v3_complete_object_dtor;
1521 break;
1522 case '2':
1523 kind = gnu_v3_base_object_dtor;
1524 break;
1525 default:
1526 return NULL;
1527 }
1528 return d_make_dtor (di, kind, di->last_name);
1529 }
1530
1531 default:
1532 return NULL;
1533 }
1534 }
1535
1536 /* <type> ::= <builtin-type>
1537 ::= <function-type>
1538 ::= <class-enum-type>
1539 ::= <array-type>
1540 ::= <pointer-to-member-type>
1541 ::= <template-param>
1542 ::= <template-template-param> <template-args>
1543 ::= <substitution>
1544 ::= <CV-qualifiers> <type>
1545 ::= P <type>
1546 ::= R <type>
1547 ::= C <type>
1548 ::= G <type>
1549 ::= U <source-name> <type>
1550
1551 <builtin-type> ::= various one letter codes
1552 ::= u <source-name>
1553 */
1554
1555 static const struct d_builtin_type_info d_builtin_types[26] =
1556 {
1557 /* a */ { "signed char", "signed char", D_PRINT_INT },
1558 /* b */ { "bool", "boolean", D_PRINT_BOOL },
1559 /* c */ { "char", "byte", D_PRINT_INT },
1560 /* d */ { "double", "double", D_PRINT_DEFAULT },
1561 /* e */ { "long double", "long double", D_PRINT_DEFAULT },
1562 /* f */ { "float", "float", D_PRINT_DEFAULT },
1563 /* g */ { "__float128", "__float128", D_PRINT_DEFAULT },
1564 /* h */ { "unsigned char", "unsigned char", D_PRINT_INT },
1565 /* i */ { "int", "int", D_PRINT_INT },
1566 /* j */ { "unsigned int", "unsigned", D_PRINT_INT },
1567 /* k */ { NULL, NULL, D_PRINT_DEFAULT },
1568 /* l */ { "long", "long", D_PRINT_LONG },
1569 /* m */ { "unsigned long", "unsigned long", D_PRINT_LONG },
1570 /* n */ { "__int128", "__int128", D_PRINT_DEFAULT },
1571 /* o */ { "unsigned __int128", "unsigned __int128", D_PRINT_DEFAULT },
1572 /* p */ { NULL, NULL, D_PRINT_DEFAULT },
1573 /* q */ { NULL, NULL, D_PRINT_DEFAULT },
1574 /* r */ { NULL, NULL, D_PRINT_DEFAULT },
1575 /* s */ { "short", "short", D_PRINT_INT },
1576 /* t */ { "unsigned short", "unsigned short", D_PRINT_INT },
1577 /* u */ { NULL, NULL, D_PRINT_DEFAULT },
1578 /* v */ { "void", "void", D_PRINT_VOID },
1579 /* w */ { "wchar_t", "char", D_PRINT_INT },
1580 /* x */ { "long long", "long", D_PRINT_DEFAULT },
1581 /* y */ { "unsigned long long", "unsigned long long", D_PRINT_DEFAULT },
1582 /* z */ { "...", "...", D_PRINT_DEFAULT },
1583 };
1584
1585 static struct d_comp *
1586 d_type (di)
1587 struct d_info *di;
1588 {
1589 char peek;
1590 struct d_comp *ret;
1591 int can_subst;
1592
1593 /* The ABI specifies that when CV-qualifiers are used, the base type
1594 is substitutable, and the fully qualified type is substitutable,
1595 but the base type with a strict subset of the CV-qualifiers is
1596 not substitutable. The natural recursive implementation of the
1597 CV-qualifiers would cause subsets to be substitutable, so instead
1598 we pull them all off now.
1599
1600 FIXME: The ABI specifies that vendor qualifiers are handled just
1601 like the standard CV-qualifiers with respect to subsetting and
1602 substitution, but g++ does not appear to work this way. */
1603
1604 peek = d_peek_char (di);
1605 if (peek == 'r' || peek == 'V' || peek == 'K')
1606 {
1607 struct d_comp **pret;
1608
1609 pret = d_cv_qualifiers (di, &ret);
1610 *pret = d_type (di);
1611 if (! d_add_substitution (di, ret))
1612 return NULL;
1613 return ret;
1614 }
1615
1616 can_subst = 1;
1617
1618 switch (peek)
1619 {
1620 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
1621 case 'h': case 'i': case 'j': case 'l': case 'm': case 'n':
1622 case 'o': case 's': case 't':
1623 case 'v': case 'w': case 'x': case 'y': case 'z':
1624 /* FIXME: The old demangler handles Java types here. */
1625 ret = d_make_builtin_type (di, &d_builtin_types[peek - 'a']);
1626 can_subst = 0;
1627 d_advance (di, 1);
1628 break;
1629
1630 case 'u':
1631 d_advance (di, 1);
1632 ret = d_make_comp (di, D_COMP_VENDOR_TYPE, d_source_name (di), NULL);
1633 break;
1634
1635 case 'F':
1636 ret = d_function_type (di);
1637 break;
1638
1639 case '0': case '1': case '2': case '3': case '4':
1640 case '5': case '6': case '7': case '8': case '9':
1641 case 'N':
1642 case 'Z':
1643 ret = d_class_enum_type (di);
1644 break;
1645
1646 case 'A':
1647 ret = d_array_type (di);
1648 break;
1649
1650 case 'M':
1651 ret = d_pointer_to_member_type (di);
1652 break;
1653
1654 case 'T':
1655 ret = d_template_param (di);
1656 if (d_peek_char (di) == 'I')
1657 {
1658 /* This is <template-template-param> <template-args>. The
1659 <template-template-param> part is a substitution
1660 candidate. */
1661 if (! d_add_substitution (di, ret))
1662 return NULL;
1663 ret = d_make_comp (di, D_COMP_TEMPLATE, ret, d_template_args (di));
1664 }
1665 break;
1666
1667 case 'S':
1668 /* If this is a special substitution, then it is the start of
1669 <class-enum-type>. */
1670 {
1671 char peek_next;
1672
1673 peek_next = d_peek_next_char (di);
1674 if (IS_DIGIT (peek_next)
1675 || peek_next == '_'
1676 || (peek_next >= 'A' && peek_next <= 'Z'))
1677 {
1678 ret = d_substitution (di);
1679 /* The substituted name may have been a template name and
1680 may be followed by tepmlate args. */
1681 if (d_peek_char (di) == 'I')
1682 ret = d_make_comp (di, D_COMP_TEMPLATE, ret,
1683 d_template_args (di));
1684 else
1685 can_subst = 0;
1686 }
1687 else
1688 {
1689 ret = d_class_enum_type (di);
1690 /* If the substitution was a complete type, then it is not
1691 a new substitution candidate. However, if the
1692 substitution was followed by template arguments, then
1693 the whole thing is a substitution candidate. */
1694 if (ret->type == D_COMP_SUB_STD)
1695 can_subst = 0;
1696 }
1697 }
1698 break;
1699
1700 case 'P':
1701 d_advance (di, 1);
1702 ret = d_make_comp (di, D_COMP_POINTER, d_type (di), NULL);
1703 break;
1704
1705 case 'R':
1706 d_advance (di, 1);
1707 ret = d_make_comp (di, D_COMP_REFERENCE, d_type (di), NULL);
1708 break;
1709
1710 case 'C':
1711 d_advance (di, 1);
1712 ret = d_make_comp (di, D_COMP_COMPLEX, d_type (di), NULL);
1713 break;
1714
1715 case 'G':
1716 d_advance (di, 1);
1717 ret = d_make_comp (di, D_COMP_IMAGINARY, d_type (di), NULL);
1718 break;
1719
1720 case 'U':
1721 d_advance (di, 1);
1722 ret = d_source_name (di);
1723 ret = d_make_comp (di, D_COMP_VENDOR_TYPE_QUAL, d_type (di), ret);
1724 break;
1725
1726 default:
1727 return NULL;
1728 }
1729
1730 if (can_subst)
1731 {
1732 if (! d_add_substitution (di, ret))
1733 return NULL;
1734 }
1735
1736 return ret;
1737 }
1738
1739 /* <CV-qualifiers> ::= [r] [V] [K] */
1740
1741 static struct d_comp **
1742 d_cv_qualifiers (di, pret)
1743 struct d_info *di;
1744 struct d_comp **pret;
1745 {
1746 char peek;
1747
1748 peek = d_peek_char (di);
1749 while (peek == 'r' || peek == 'V' || peek == 'K')
1750 {
1751 enum d_comp_type t;
1752
1753 d_advance (di, 1);
1754 if (peek == 'r')
1755 t = D_COMP_RESTRICT;
1756 else if (peek == 'V')
1757 t = D_COMP_VOLATILE;
1758 else
1759 t = D_COMP_CONST;
1760
1761 *pret = d_make_comp (di, t, NULL, NULL);
1762 if (*pret == NULL)
1763 return NULL;
1764 pret = &d_left (*pret);
1765
1766 peek = d_peek_char (di);
1767 }
1768
1769 return pret;
1770 }
1771
1772 /* <function-type> ::= F [Y] <bare-function-type> E */
1773
1774 static struct d_comp *
1775 d_function_type (di)
1776 struct d_info *di;
1777 {
1778 struct d_comp *ret;
1779
1780 if (d_next_char (di) != 'F')
1781 return NULL;
1782 if (d_peek_char (di) == 'Y')
1783 {
1784 /* Function has C linkage. We don't print this information.
1785 FIXME: We should print it in verbose mode. */
1786 d_advance (di, 1);
1787 }
1788 ret = d_bare_function_type (di, 1);
1789 if (d_next_char (di) != 'E')
1790 return NULL;
1791 return ret;
1792 }
1793
1794 /* <bare-function-type> ::= <type>+ */
1795
1796 static struct d_comp *
1797 d_bare_function_type (di, has_return_type)
1798 struct d_info *di;
1799 int has_return_type;
1800 {
1801 struct d_comp *return_type;
1802 struct d_comp *tl;
1803 struct d_comp **ptl;
1804
1805 return_type = NULL;
1806 tl = NULL;
1807 ptl = &tl;
1808 while (1)
1809 {
1810 char peek;
1811 struct d_comp *type;
1812
1813 peek = d_peek_char (di);
1814 if (peek == '\0' || peek == 'E')
1815 break;
1816 type = d_type (di);
1817 if (type == NULL)
1818 return NULL;
1819 if (has_return_type)
1820 {
1821 return_type = type;
1822 has_return_type = 0;
1823 }
1824 else
1825 {
1826 *ptl = d_make_comp (di, D_COMP_ARGLIST, type, NULL);
1827 ptl = &d_right (*ptl);
1828 }
1829 }
1830
1831 /* There should be at least one parameter type besides the optional
1832 return type. A function which takes no arguments will have a
1833 single parameter type void. */
1834 if (tl == NULL)
1835 return NULL;
1836
1837 /* If we have a single parameter type void, omit it. */
1838 if (d_right (tl) == NULL
1839 && d_left (tl)->type == D_COMP_BUILTIN_TYPE
1840 && d_left (tl)->u.s_builtin.type->print == D_PRINT_VOID)
1841 tl = NULL;
1842
1843 return d_make_comp (di, D_COMP_FUNCTION_TYPE, return_type, tl);
1844 }
1845
1846 /* <class-enum-type> ::= <name> */
1847
1848 static struct d_comp *
1849 d_class_enum_type (di)
1850 struct d_info *di;
1851 {
1852 return d_name (di);
1853 }
1854
1855 /* <array-type> ::= A <(positive dimension) number> _ <(element) type>
1856 ::= A [<(dimension) expression>] _ <(element) type>
1857 */
1858
1859 static struct d_comp *
1860 d_array_type (di)
1861 struct d_info *di;
1862 {
1863 char peek;
1864 struct d_comp *dim;
1865
1866 if (d_next_char (di) != 'A')
1867 return NULL;
1868
1869 peek = d_peek_char (di);
1870 if (peek == '_')
1871 dim = NULL;
1872 else if (IS_DIGIT (peek))
1873 {
1874 const char *s;
1875
1876 s = d_str (di);
1877 do
1878 {
1879 d_advance (di, 1);
1880 peek = d_peek_char (di);
1881 }
1882 while (IS_DIGIT (peek));
1883 dim = d_make_name (di, s, d_str (di) - s);
1884 }
1885 else
1886 {
1887 dim = d_expression (di);
1888 if (dim == NULL)
1889 return NULL;
1890 }
1891
1892 if (d_next_char (di) != '_')
1893 return NULL;
1894
1895 return d_make_comp (di, D_COMP_ARRAY_TYPE, dim, d_type (di));
1896 }
1897
1898 /* <pointer-to-member-type> ::= M <(class) type> <(member) type> */
1899
1900 static struct d_comp *
1901 d_pointer_to_member_type (di)
1902 struct d_info *di;
1903 {
1904 struct d_comp *cl;
1905 struct d_comp *mem;
1906 struct d_comp **pmem;
1907
1908 if (d_next_char (di) != 'M')
1909 return NULL;
1910
1911 cl = d_type (di);
1912
1913 /* The ABI specifies that any type can be a substitution source, and
1914 that M is followed by two types, and that when a CV-qualified
1915 type is seen both the base type and the CV-qualified types are
1916 substitution sources. The ABI also specifies that for a pointer
1917 to a CV-qualified member function, the qualifiers are attached to
1918 the second type. Given the grammar, a plain reading of the ABI
1919 suggests that both the CV-qualified member function and the
1920 non-qualified member function are substitution sources. However,
1921 g++ does not work that way. g++ treats only the CV-qualified
1922 member function as a substitution source. FIXME. So to work
1923 with g++, we need to pull off the CV-qualifiers here, in order to
1924 avoid calling add_substitution() in d_type(). */
1925
1926 pmem = d_cv_qualifiers (di, &mem);
1927 *pmem = d_type (di);
1928
1929 return d_make_comp (di, D_COMP_PTRMEM_TYPE, cl, mem);
1930 }
1931
1932 /* <template-param> ::= T_
1933 ::= T <(parameter-2 non-negative) number> _
1934 */
1935
1936 static struct d_comp *
1937 d_template_param (di)
1938 struct d_info *di;
1939 {
1940 long param;
1941
1942 if (d_next_char (di) != 'T')
1943 return NULL;
1944
1945 if (d_peek_char (di) == '_')
1946 param = 0;
1947 else
1948 {
1949 param = d_number (di);
1950 if (param < 0)
1951 return NULL;
1952 param += 1;
1953 }
1954
1955 if (d_next_char (di) != '_')
1956 return NULL;
1957
1958 return d_make_template_param (di, param);
1959 }
1960
1961 /* <template-args> ::= I <template-arg>+ E */
1962
1963 static struct d_comp *
1964 d_template_args (di)
1965 struct d_info *di;
1966 {
1967 struct d_comp *hold_last_name;
1968 struct d_comp *al;
1969 struct d_comp **pal;
1970
1971 /* Preserve the last name we saw--don't let the template arguments
1972 clobber it, as that would give us the wrong name for a subsequent
1973 constructor or destructor. */
1974 hold_last_name = di->last_name;
1975
1976 if (d_next_char (di) != 'I')
1977 return NULL;
1978
1979 al = NULL;
1980 pal = &al;
1981 while (1)
1982 {
1983 struct d_comp *a;
1984
1985 a = d_template_arg (di);
1986 if (a == NULL)
1987 return NULL;
1988
1989 *pal = d_make_comp (di, D_COMP_TEMPLATE_ARGLIST, a, NULL);
1990 pal = &d_right (*pal);
1991
1992 if (d_peek_char (di) == 'E')
1993 {
1994 d_advance (di, 1);
1995 break;
1996 }
1997 }
1998
1999 di->last_name = hold_last_name;
2000
2001 return al;
2002 }
2003
2004 /* <template-arg> ::= <type>
2005 ::= X <expression> E
2006 ::= <expr-primary>
2007 */
2008
2009 static struct d_comp *
2010 d_template_arg (di)
2011 struct d_info *di;
2012 {
2013 struct d_comp *ret;
2014
2015 switch (d_peek_char (di))
2016 {
2017 case 'X':
2018 d_advance (di, 1);
2019 ret = d_expression (di);
2020 if (d_next_char (di) != 'E')
2021 return NULL;
2022 return ret;
2023
2024 case 'L':
2025 return d_expr_primary (di);
2026
2027 default:
2028 return d_type (di);
2029 }
2030 }
2031
2032 /* <expression> ::= <(unary) operator-name> <expression>
2033 ::= <(binary) operator-name> <expression> <expression>
2034 ::= <(trinary) operator-name> <expression> <expression> <expression>
2035 ::= st <type>
2036 ::= <template-param>
2037 ::= sr <type> <unqualified-name>
2038 ::= sr <type> <unqualified-name> <template-args>
2039 ::= <expr-primary>
2040 */
2041
2042 static struct d_comp *
2043 d_expression (di)
2044 struct d_info *di;
2045 {
2046 char peek;
2047
2048 peek = d_peek_char (di);
2049 if (peek == 'L')
2050 return d_expr_primary (di);
2051 else if (peek == 'T')
2052 return d_template_param (di);
2053 else if (peek == 's' && d_peek_next_char (di) == 'r')
2054 {
2055 struct d_comp *type;
2056 struct d_comp *name;
2057
2058 d_advance (di, 2);
2059 type = d_type (di);
2060 name = d_unqualified_name (di);
2061 if (d_peek_char (di) != 'I')
2062 return d_make_comp (di, D_COMP_QUAL_NAME, type, name);
2063 else
2064 return d_make_comp (di, D_COMP_QUAL_NAME, type,
2065 d_make_comp (di, D_COMP_TEMPLATE, name,
2066 d_template_args (di)));
2067 }
2068 else
2069 {
2070 struct d_comp *op;
2071 int args;
2072
2073 op = d_operator_name (di);
2074 if (op == NULL)
2075 return NULL;
2076
2077 if (op->type == D_COMP_OPERATOR
2078 && strcmp (op->u.s_operator.op->code, "st") == 0)
2079 return d_make_comp (di, D_COMP_UNARY, op, d_type (di));
2080
2081 switch (op->type)
2082 {
2083 default:
2084 return NULL;
2085 case D_COMP_OPERATOR:
2086 args = op->u.s_operator.op->args;
2087 break;
2088 case D_COMP_EXTENDED_OPERATOR:
2089 args = op->u.s_extended_operator.args;
2090 break;
2091 case D_COMP_CAST:
2092 args = 1;
2093 break;
2094 }
2095
2096 switch (args)
2097 {
2098 case 1:
2099 return d_make_comp (di, D_COMP_UNARY, op, d_expression (di));
2100 case 2:
2101 {
2102 struct d_comp *left;
2103
2104 left = d_expression (di);
2105 return d_make_comp (di, D_COMP_BINARY, op,
2106 d_make_comp (di, D_COMP_BINARY_ARGS, left,
2107 d_expression (di)));
2108 }
2109 case 3:
2110 {
2111 struct d_comp *first;
2112 struct d_comp *second;
2113
2114 first = d_expression (di);
2115 second = d_expression (di);
2116 return d_make_comp (di, D_COMP_TRINARY, op,
2117 d_make_comp (di, D_COMP_TRINARY_ARG1, first,
2118 d_make_comp (di,
2119 D_COMP_TRINARY_ARG2,
2120 second,
2121 d_expression (di))));
2122 }
2123 default:
2124 return NULL;
2125 }
2126 }
2127 }
2128
2129 /* <expr-primary> ::= L <type> <(value) number> E
2130 ::= L <type> <(value) float> E
2131 ::= L <mangled-name> E
2132 */
2133
2134 static struct d_comp *
2135 d_expr_primary (di)
2136 struct d_info *di;
2137 {
2138 struct d_comp *ret;
2139
2140 if (d_next_char (di) != 'L')
2141 return NULL;
2142 if (d_peek_char (di) == '_')
2143 ret = d_mangled_name (di);
2144 else
2145 {
2146 struct d_comp *type;
2147 const char *s;
2148
2149 type = d_type (di);
2150
2151 /* Rather than try to interpret the literal value, we just
2152 collect it as a string. Note that it's possible to have a
2153 floating point literal here. The ABI specifies that the
2154 format of such literals is machine independent. That's fine,
2155 but what's not fine is that versions of g++ up to 3.2 with
2156 -fabi-version=1 used upper case letters in the hex constant,
2157 and dumped out gcc's internal representation. That makes it
2158 hard to tell where the constant ends, and hard to dump the
2159 constant in any readable form anyhow. We don't attempt to
2160 handle these cases. */
2161
2162 s = d_str (di);
2163 while (d_peek_char (di) != 'E')
2164 d_advance (di, 1);
2165 ret = d_make_comp (di, D_COMP_LITERAL, type,
2166 d_make_name (di, s, d_str (di) - s));
2167 }
2168 if (d_next_char (di) != 'E')
2169 return NULL;
2170 return ret;
2171 }
2172
2173 /* <local-name> ::= Z <(function) encoding> E <(entity) name> [<discriminator>]
2174 ::= Z <(function) encoding> E s [<discriminator>]
2175 */
2176
2177 static struct d_comp *
2178 d_local_name (di)
2179 struct d_info *di;
2180 {
2181 struct d_comp *function;
2182
2183 if (d_next_char (di) != 'Z')
2184 return NULL;
2185
2186 function = d_encoding (di);
2187
2188 if (d_next_char (di) != 'E')
2189 return NULL;
2190
2191 if (d_peek_char (di) == 's')
2192 {
2193 d_advance (di, 1);
2194 if (! d_discriminator (di))
2195 return NULL;
2196 return d_make_comp (di, D_COMP_QUAL_NAME, function,
2197 d_make_name (di, "string literal",
2198 sizeof "string literal" - 1));
2199 }
2200 else
2201 {
2202 struct d_comp *name;
2203
2204 name = d_name (di);
2205 if (! d_discriminator (di))
2206 return NULL;
2207 return d_make_comp (di, D_COMP_QUAL_NAME, function, name);
2208 }
2209 }
2210
2211 /* <discriminator> ::= _ <(non-negative) number>
2212
2213 We demangle the discriminator, but we don't print it out. FIXME:
2214 We should print it out in verbose mode. */
2215
2216 static int
2217 d_discriminator (di)
2218 struct d_info *di;
2219 {
2220 long discrim;
2221
2222 if (d_peek_char (di) != '_')
2223 return 1;
2224 d_advance (di, 1);
2225 discrim = d_number (di);
2226 if (discrim < 0)
2227 return 0;
2228 return 1;
2229 }
2230
2231 /* Add a new substitution. */
2232
2233 static int
2234 d_add_substitution (di, dc)
2235 struct d_info *di;
2236 struct d_comp *dc;
2237 {
2238 if (di->next_sub >= di->num_subs)
2239 return 0;
2240 di->subs[di->next_sub] = dc;
2241 ++di->next_sub;
2242 return 1;
2243 }
2244
2245 /* <substitution> ::= S <seq-id> _
2246 ::= S_
2247 ::= St
2248 ::= Sa
2249 ::= Sb
2250 ::= Ss
2251 ::= Si
2252 ::= So
2253 ::= Sd
2254 */
2255
2256 static struct d_comp *
2257 d_substitution (di)
2258 struct d_info *di;
2259 {
2260 char c;
2261
2262 if (d_next_char (di) != 'S')
2263 return NULL;
2264
2265 c = d_next_char (di);
2266 if (c == '_' || IS_DIGIT (c) || (c >= 'A' && c <= 'Z'))
2267 {
2268 int id;
2269
2270 id = 0;
2271 if (c != '_')
2272 {
2273 do
2274 {
2275 if (IS_DIGIT (c))
2276 id = id * 36 + c - '0';
2277 else if (c >= 'A' && c <= 'Z')
2278 id = id * 36 + c - 'A' + 10;
2279 else
2280 return NULL;
2281 c = d_next_char (di);
2282 }
2283 while (c != '_');
2284
2285 ++id;
2286 }
2287
2288 if (id >= di->next_sub)
2289 return NULL;
2290
2291 return di->subs[id];
2292 }
2293 else
2294 {
2295 switch (c)
2296 {
2297 case 't':
2298 return d_make_sub (di, "std");
2299 case 'a':
2300 di->last_name = d_make_sub (di, "allocator");
2301 return d_make_sub (di, "std::allocator");
2302 case 'b':
2303 di->last_name = d_make_sub (di, "basic_string");
2304 return d_make_sub (di, "std::basic_string");
2305 case 's':
2306 di->last_name = d_make_sub (di, "string");
2307 return d_make_sub (di, "std::string");
2308 case 'i':
2309 di->last_name = d_make_sub (di, "istream");
2310 return d_make_sub (di, "std::istream");
2311 case 'o':
2312 di->last_name = d_make_sub (di, "ostream");
2313 return d_make_sub (di, "std::ostream");
2314 case 'd':
2315 di->last_name = d_make_sub (di, "iostream");
2316 return d_make_sub (di, "std::iostream");
2317 default:
2318 return NULL;
2319 }
2320 }
2321 }
2322
2323 /* Resize the print buffer. */
2324
2325 static void
2326 d_print_resize (dpi, add)
2327 struct d_print_info *dpi;
2328 size_t add;
2329 {
2330 size_t need;
2331
2332 need = dpi->len + add;
2333 while (need > dpi->alc)
2334 {
2335 size_t newalc;
2336 char *newbuf;
2337
2338 newalc = dpi->alc * 2;
2339 newbuf = realloc (dpi->buf, newalc);
2340 if (newbuf == NULL)
2341 {
2342 free (dpi->buf);
2343 dpi->buf = NULL;
2344 dpi->allocation_failure = 1;
2345 return;
2346 }
2347 dpi->buf = newbuf;
2348 dpi->alc = newalc;
2349 }
2350 }
2351
2352 /* Append a character to the print buffer. */
2353
2354 static void
2355 d_print_append_char (dpi, c)
2356 struct d_print_info *dpi;
2357 int c;
2358 {
2359 if (dpi->buf != NULL)
2360 {
2361 if (dpi->len >= dpi->alc)
2362 {
2363 d_print_resize (dpi, 1);
2364 if (dpi->buf == NULL)
2365 return;
2366 }
2367
2368 dpi->buf[dpi->len] = c;
2369 ++dpi->len;
2370 }
2371 }
2372
2373 /* Append a buffer to the print buffer. */
2374
2375 static void
2376 d_print_append_buffer (dpi, s, l)
2377 struct d_print_info *dpi;
2378 const char *s;
2379 size_t l;
2380 {
2381 if (dpi->buf != NULL)
2382 {
2383 if (dpi->len + l > dpi->alc)
2384 {
2385 d_print_resize (dpi, l);
2386 if (dpi->buf == NULL)
2387 return;
2388 }
2389
2390 memcpy (dpi->buf + dpi->len, s, l);
2391 dpi->len += l;
2392 }
2393 }
2394
2395 /* Indicate that an error occurred during printing. */
2396
2397 static void
2398 d_print_error (dpi)
2399 struct d_print_info *dpi;
2400 {
2401 free (dpi->buf);
2402 dpi->buf = NULL;
2403 }
2404
2405 /* Turn components into a human readable string. Returns a string
2406 allocated by malloc, or NULL on error. On success, this sets *PALC
2407 to the size of the allocated buffer. On failure, this sets *PALC
2408 to 0 for a bad parse, or to 1 for a memory allocation failure. */
2409
2410 static char *
2411 d_print (options, dc, palc)
2412 int options;
2413 const struct d_comp *dc;
2414 size_t *palc;
2415 {
2416 struct d_print_info dpi;
2417
2418 dpi.options = options;
2419
2420 dpi.alc = 64;
2421 dpi.buf = malloc (dpi.alc);
2422 if (dpi.buf == NULL)
2423 {
2424 *palc = 1;
2425 return NULL;
2426 }
2427
2428 dpi.len = 0;
2429 dpi.templates = NULL;
2430 dpi.modifiers = NULL;
2431
2432 dpi.allocation_failure = 0;
2433
2434 d_print_comp (&dpi, dc);
2435
2436 d_append_char (&dpi, '\0');
2437
2438 if (dpi.buf != NULL)
2439 *palc = dpi.alc;
2440 else
2441 *palc = dpi.allocation_failure;
2442
2443 return dpi.buf;
2444 }
2445
2446 /* Subroutine to handle components. */
2447
2448 static void
2449 d_print_comp (dpi, dc)
2450 struct d_print_info *dpi;
2451 const struct d_comp *dc;
2452 {
2453 if (dc == NULL)
2454 {
2455 d_print_error (dpi);
2456 return;
2457 }
2458 if (d_print_saw_error (dpi))
2459 return;
2460
2461 switch (dc->type)
2462 {
2463 case D_COMP_NAME:
2464 d_print_identifier (dpi, dc->u.s_name.s, dc->u.s_name.len);
2465 return;
2466
2467 case D_COMP_QUAL_NAME:
2468 d_print_comp (dpi, d_left (dc));
2469 d_append_string (dpi, (dpi->options & DMGL_JAVA) == 0 ? "::" : ".");
2470 d_print_comp (dpi, d_right (dc));
2471 return;
2472
2473 case D_COMP_TYPED_NAME:
2474 {
2475 const struct d_comp *typed_name;
2476 struct d_print_mod dpm;
2477 struct d_print_template dpt;
2478
2479 /* Pass the name down to the type so that it can be printed in
2480 the right place for the type. If the name has
2481 CV-qualifiers, they are really method qualifiers; pull them
2482 off now and print them after everything else. Note that we
2483 don't handle D_COMP_VENDOR_TYPE_QUAL here; it's not
2484 accepted by d_cv_qualifiers() either. */
2485 typed_name = d_left (dc);
2486 while (typed_name != NULL
2487 && (typed_name->type == D_COMP_RESTRICT
2488 || typed_name->type == D_COMP_VOLATILE
2489 || typed_name->type == D_COMP_CONST))
2490 typed_name = d_left (typed_name);
2491
2492 dpm.next = dpi->modifiers;
2493 dpi->modifiers = &dpm;
2494 dpm.mod = typed_name;
2495 dpm.printed = 0;
2496
2497 /* If typed_name is a template, then it applies to the
2498 function type as well. */
2499 if (typed_name->type == D_COMP_TEMPLATE)
2500 {
2501 dpt.next = dpi->templates;
2502 dpi->templates = &dpt;
2503 dpt.template = typed_name;
2504 }
2505
2506 d_print_comp (dpi, d_right (dc));
2507
2508 if (typed_name->type == D_COMP_TEMPLATE)
2509 dpi->templates = dpt.next;
2510
2511 /* If the modifier didn't get printed by the type, print it
2512 now. */
2513 if (! dpm.printed)
2514 {
2515 d_append_char (dpi, ' ');
2516 d_print_comp (dpi, typed_name);
2517 }
2518
2519 dpi->modifiers = dpm.next;
2520
2521 /* Now print any CV-qualifiers on the type. */
2522 typed_name = d_left (dc);
2523 while (typed_name != NULL
2524 && (typed_name->type == D_COMP_RESTRICT
2525 || typed_name->type == D_COMP_VOLATILE
2526 || typed_name->type == D_COMP_CONST))
2527 {
2528 d_print_mod (dpi, typed_name);
2529 typed_name = d_left (typed_name);
2530 }
2531
2532 return;
2533 }
2534
2535 case D_COMP_TEMPLATE:
2536 d_print_comp (dpi, d_left (dc));
2537 d_append_char (dpi, '<');
2538 d_print_comp (dpi, d_right (dc));
2539 /* Avoid generating two consecutive '>' characters, to avoid the
2540 C++ syntactic ambiguity. */
2541 if (dpi->buf[dpi->len - 1] == '>')
2542 d_append_char (dpi, ' ');
2543 d_append_char (dpi, '>');
2544 return;
2545
2546 case D_COMP_TEMPLATE_PARAM:
2547 {
2548 long i;
2549 struct d_comp *a;
2550 struct d_print_template *hold_dpt;
2551
2552 if (dpi->templates == NULL)
2553 {
2554 d_print_error (dpi);
2555 return;
2556 }
2557 i = dc->u.s_number.number;
2558 for (a = d_right (dpi->templates->template);
2559 a != NULL;
2560 a = d_right (a))
2561 {
2562 if (a->type != D_COMP_TEMPLATE_ARGLIST)
2563 {
2564 d_print_error (dpi);
2565 return;
2566 }
2567 if (i <= 0)
2568 break;
2569 --i;
2570 }
2571 if (i != 0 || a == NULL)
2572 {
2573 d_print_error (dpi);
2574 return;
2575 }
2576
2577 /* While processing this parameter, we need to pop the list of
2578 templates. This is because the template parameter may
2579 itself be a reference to a parameter of an outer
2580 template. */
2581
2582 hold_dpt = dpi->templates;
2583 dpi->templates = hold_dpt->next;
2584
2585 d_print_comp (dpi, d_left (a));
2586
2587 dpi->templates = hold_dpt;
2588
2589 return;
2590 }
2591
2592 case D_COMP_CTOR:
2593 d_print_comp (dpi, dc->u.s_ctor.name);
2594 return;
2595
2596 case D_COMP_DTOR:
2597 d_append_char (dpi, '~');
2598 d_print_comp (dpi, dc->u.s_dtor.name);
2599 return;
2600
2601 case D_COMP_VTABLE:
2602 d_append_string (dpi, "vtable for ");
2603 d_print_comp (dpi, d_left (dc));
2604 return;
2605
2606 case D_COMP_VTT:
2607 d_append_string (dpi, "VTT for ");
2608 d_print_comp (dpi, d_left (dc));
2609 return;
2610
2611 case D_COMP_CONSTRUCTION_VTABLE:
2612 d_append_string (dpi, "construction vtable for ");
2613 d_print_comp (dpi, d_left (dc));
2614 d_append_string (dpi, "-in-");
2615 d_print_comp (dpi, d_right (dc));
2616 return;
2617
2618 case D_COMP_TYPEINFO:
2619 d_append_string (dpi, "typeinfo for ");
2620 d_print_comp (dpi, d_left (dc));
2621 return;
2622
2623 case D_COMP_TYPEINFO_NAME:
2624 d_append_string (dpi, "typeinfo name for ");
2625 d_print_comp (dpi, d_left (dc));
2626 return;
2627
2628 case D_COMP_TYPEINFO_FN:
2629 d_append_string (dpi, "typeinfo fn for ");
2630 d_print_comp (dpi, d_left (dc));
2631 return;
2632
2633 case D_COMP_THUNK:
2634 d_append_string (dpi, "non-virtual thunk to ");
2635 d_print_comp (dpi, d_left (dc));
2636 return;
2637
2638 case D_COMP_VIRTUAL_THUNK:
2639 d_append_string (dpi, "virtual thunk to ");
2640 d_print_comp (dpi, d_left (dc));
2641 return;
2642
2643 case D_COMP_COVARIANT_THUNK:
2644 d_append_string (dpi, "covariant return thunk to ");
2645 d_print_comp (dpi, d_left (dc));
2646 return;
2647
2648 case D_COMP_JAVA_CLASS:
2649 d_append_string (dpi, "java Class for ");
2650 d_print_comp (dpi, d_left (dc));
2651 return;
2652
2653 case D_COMP_GUARD:
2654 d_append_string (dpi, "guard variable for ");
2655 d_print_comp (dpi, d_left (dc));
2656 return;
2657
2658 case D_COMP_REFTEMP:
2659 d_append_string (dpi, "reference temporary for ");
2660 d_print_comp (dpi, d_left (dc));
2661 return;
2662
2663 case D_COMP_SUB_STD:
2664 d_append_string (dpi, dc->u.s_string.string);
2665 return;
2666
2667 case D_COMP_RESTRICT:
2668 case D_COMP_VOLATILE:
2669 case D_COMP_CONST:
2670 case D_COMP_VENDOR_TYPE_QUAL:
2671 case D_COMP_POINTER:
2672 case D_COMP_REFERENCE:
2673 case D_COMP_COMPLEX:
2674 case D_COMP_IMAGINARY:
2675 {
2676 /* We keep a list of modifiers on the stack. */
2677 struct d_print_mod dpm;
2678
2679 dpm.next = dpi->modifiers;
2680 dpi->modifiers = &dpm;
2681 dpm.mod = dc;
2682 dpm.printed = 0;
2683
2684 d_print_comp (dpi, d_left (dc));
2685
2686 /* If the modifier didn't get printed by the type, print it
2687 now. */
2688 if (! dpm.printed)
2689 d_print_mod (dpi, dc);
2690
2691 dpi->modifiers = dpm.next;
2692
2693 return;
2694 }
2695
2696 case D_COMP_BUILTIN_TYPE:
2697 if ((dpi->options & DMGL_JAVA) == 0)
2698 d_append_string (dpi, dc->u.s_builtin.type->name);
2699 else
2700 d_append_string (dpi, dc->u.s_builtin.type->java_name);
2701 return;
2702
2703 case D_COMP_VENDOR_TYPE:
2704 d_print_comp (dpi, d_left (dc));
2705 return;
2706
2707 case D_COMP_FUNCTION_TYPE:
2708 {
2709 if (d_left (dc) != NULL)
2710 {
2711 struct d_print_mod dpm;
2712
2713 /* We must pass this type down as a modifier in order to
2714 print it in the right location. */
2715
2716 dpm.next = dpi->modifiers;
2717 dpi->modifiers = &dpm;
2718 dpm.mod = dc;
2719 dpm.printed = 0;
2720
2721 d_print_comp (dpi, d_left (dc));
2722
2723 dpi->modifiers = dpm.next;
2724
2725 if (dpm.printed)
2726 return;
2727
2728 d_append_char (dpi, ' ');
2729 }
2730
2731 d_print_function_type (dpi, dc, dpi->modifiers);
2732
2733 return;
2734 }
2735
2736 case D_COMP_ARRAY_TYPE:
2737 {
2738 struct d_print_mod dpm;
2739
2740 /* We must pass this type down as a modifier in order to print
2741 multi-dimensional arrays correctly. */
2742
2743 dpm.next = dpi->modifiers;
2744 dpi->modifiers = &dpm;
2745 dpm.mod = dc;
2746 dpm.printed = 0;
2747
2748 d_print_comp (dpi, d_right (dc));
2749
2750 dpi->modifiers = dpm.next;
2751
2752 if (dpm.printed)
2753 return;
2754
2755 d_print_array_type (dpi, dc, dpi->modifiers);
2756
2757 return;
2758 }
2759
2760 case D_COMP_PTRMEM_TYPE:
2761 {
2762 const struct d_comp *target_type;
2763 struct d_print_mod dpm;
2764
2765 /* Pass the name down to the type so that it can be printed in
2766 the right place for the type. If the type has
2767 CV-qualifiers, they are really method qualifiers; pull them
2768 off now and print them after everything else. */
2769 target_type = d_right (dc);
2770 while (target_type != NULL
2771 && (target_type->type == D_COMP_RESTRICT
2772 || target_type->type == D_COMP_VOLATILE
2773 || target_type->type == D_COMP_CONST))
2774 target_type = d_left (target_type);
2775
2776 dpm.next = dpi->modifiers;
2777 dpi->modifiers = &dpm;
2778 dpm.mod = dc;
2779 dpm.printed = 0;
2780
2781 d_print_comp (dpi, target_type);
2782
2783 /* If the modifier didn't get printed by the type, print it
2784 now. */
2785 if (! dpm.printed)
2786 {
2787 d_append_char (dpi, ' ');
2788 d_print_comp (dpi, d_left (dc));
2789 d_append_string (dpi, "::*");
2790 }
2791
2792 dpi->modifiers = dpm.next;
2793
2794 /* Now print any CV-qualifiers on the type. */
2795 target_type = d_right (dc);
2796 while (target_type != NULL
2797 && (target_type->type == D_COMP_RESTRICT
2798 || target_type->type == D_COMP_VOLATILE
2799 || target_type->type == D_COMP_CONST))
2800 {
2801 d_print_mod (dpi, target_type);
2802 target_type = d_left (target_type);
2803 }
2804
2805 return;
2806 }
2807
2808 case D_COMP_ARGLIST:
2809 case D_COMP_TEMPLATE_ARGLIST:
2810 d_print_comp (dpi, d_left (dc));
2811 if (d_right (dc) != NULL)
2812 {
2813 d_append_string (dpi, ", ");
2814 d_print_comp (dpi, d_right (dc));
2815 }
2816 return;
2817
2818 case D_COMP_OPERATOR:
2819 {
2820 char c;
2821
2822 d_append_string (dpi, "operator");
2823 c = dc->u.s_operator.op->name[0];
2824 if (c >= 'a' && c <= 'z')
2825 d_append_char (dpi, ' ');
2826 d_append_string (dpi, dc->u.s_operator.op->name);
2827 return;
2828 }
2829
2830 case D_COMP_EXTENDED_OPERATOR:
2831 d_append_string (dpi, "operator ");
2832 d_print_comp (dpi, dc->u.s_extended_operator.name);
2833 return;
2834
2835 case D_COMP_CAST:
2836 d_append_string (dpi, "operator ");
2837 d_print_cast (dpi, dc);
2838 return;
2839
2840 case D_COMP_UNARY:
2841 if (d_left (dc)->type != D_COMP_CAST)
2842 d_print_expr_op (dpi, d_left (dc));
2843 else
2844 {
2845 d_append_string (dpi, "((");
2846 d_print_cast (dpi, d_left (dc));
2847 d_append_char (dpi, ')');
2848 }
2849 d_append_char (dpi, '(');
2850 d_print_comp (dpi, d_right (dc));
2851 d_append_char (dpi, ')');
2852 if (d_left (dc)->type == D_COMP_CAST)
2853 d_append_char (dpi, ')');
2854 return;
2855
2856 case D_COMP_BINARY:
2857 if (d_right (dc)->type != D_COMP_BINARY_ARGS)
2858 {
2859 d_print_error (dpi);
2860 return;
2861 }
2862 d_append_char (dpi, '(');
2863 d_print_comp (dpi, d_left (d_right (dc)));
2864 d_append_string (dpi, ") ");
2865 d_print_expr_op (dpi, d_left (dc));
2866 d_append_string (dpi, " (");
2867 d_print_comp (dpi, d_right (d_right (dc)));
2868 d_append_char (dpi, ')');
2869 return;
2870
2871 case D_COMP_BINARY_ARGS:
2872 /* We should only see this as part of D_COMP_BINARY. */
2873 d_print_error (dpi);
2874 return;
2875
2876 case D_COMP_TRINARY:
2877 if (d_right (dc)->type != D_COMP_TRINARY_ARG1
2878 || d_right (d_right (dc))->type != D_COMP_TRINARY_ARG2)
2879 {
2880 d_print_error (dpi);
2881 return;
2882 }
2883 d_append_char (dpi, '(');
2884 d_print_comp (dpi, d_left (d_right (dc)));
2885 d_append_string (dpi, ") ");
2886 d_print_expr_op (dpi, d_left (dc));
2887 d_append_string (dpi, " (");
2888 d_print_comp (dpi, d_left (d_right (d_right (dc))));
2889 d_append_string (dpi, ") : (");
2890 d_print_comp (dpi, d_right (d_right (d_right (dc))));
2891 d_append_char (dpi, ')');
2892 return;
2893
2894 case D_COMP_TRINARY_ARG1:
2895 case D_COMP_TRINARY_ARG2:
2896 /* We should only see these are part of D_COMP_TRINARY. */
2897 d_print_error (dpi);
2898 return;
2899
2900 case D_COMP_LITERAL:
2901 /* For some builtin types, produce simpler output. */
2902 if (d_left (dc)->type == D_COMP_BUILTIN_TYPE)
2903 {
2904 switch (d_left (dc)->u.s_builtin.type->print)
2905 {
2906 case D_PRINT_INT:
2907 if (d_right (dc)->type == D_COMP_NAME)
2908 {
2909 d_print_comp (dpi, d_right (dc));
2910 return;
2911 }
2912 break;
2913
2914 case D_PRINT_LONG:
2915 if (d_right (dc)->type == D_COMP_NAME)
2916 {
2917 d_print_comp (dpi, d_right (dc));
2918 d_append_char (dpi, 'l');
2919 return;
2920 }
2921 break;
2922
2923 case D_PRINT_BOOL:
2924 if (d_right (dc)->type == D_COMP_NAME
2925 && d_right (dc)->u.s_name.len == 1)
2926 {
2927 switch (d_right (dc)->u.s_name.s[0])
2928 {
2929 case '0':
2930 d_append_string (dpi, "false");
2931 return;
2932 case '1':
2933 d_append_string (dpi, "true");
2934 return;
2935 default:
2936 break;
2937 }
2938 }
2939 break;
2940
2941 default:
2942 break;
2943 }
2944 }
2945
2946 d_append_char (dpi, '(');
2947 d_print_comp (dpi, d_left (dc));
2948 d_append_char (dpi, ')');
2949 d_print_comp (dpi, d_right (dc));
2950 return;
2951
2952 default:
2953 d_print_error (dpi);
2954 return;
2955 }
2956 }
2957
2958 /* Print an identifier. */
2959
2960 static void
2961 d_print_identifier (dpi, name, len)
2962 struct d_print_info *dpi;
2963 const char *name;
2964 int len;
2965 {
2966 if ((dpi->options & DMGL_JAVA) == 0)
2967 d_append_buffer (dpi, name, len);
2968 else
2969 {
2970 const char *p;
2971 const char *end;
2972
2973 /* For Java we try to handle encoded extended Unicode
2974 characters. The C++ ABI doesn't mention Unicode encoding, so
2975 we don't it for C++. Characters are encoded as
2976 __U<hex-char>+_. */
2977 end = name + len;
2978 for (p = name; p < end; ++p)
2979 {
2980 if (end - p > 3
2981 && p[0] == '_'
2982 && p[1] == '_'
2983 && p[2] == 'U')
2984 {
2985 unsigned long c;
2986 const char *q;
2987
2988 c = 0;
2989 for (q = p + 3; q < end; ++q)
2990 {
2991 int dig;
2992
2993 if (*q >= '0' && *q <= '9')
2994 dig = *q - '0';
2995 else if (*q >= 'A' && *q <= 'F')
2996 dig = *q - 'A' + 10;
2997 else if (*q >= 'a' && *q <= 'f')
2998 dig = *q - 'a' + 10;
2999 else
3000 break;
3001
3002 c = c * 16 + dig;
3003 }
3004 /* If the Unicode character is larger than 256, we don't
3005 try to deal with it here. FIXME. */
3006 if (q < end && *q == '_' && c < 256)
3007 {
3008 d_append_char (dpi, c);
3009 p = q;
3010 continue;
3011 }
3012 }
3013
3014 d_append_char (dpi, *p);
3015 }
3016 }
3017 }
3018
3019 /* Print a list of modifiers. */
3020
3021 static void
3022 d_print_mod_list (dpi, mods)
3023 struct d_print_info *dpi;
3024 struct d_print_mod *mods;
3025 {
3026 if (mods == NULL || mods->printed || d_print_saw_error (dpi))
3027 return;
3028
3029 if (mods->mod->type == D_COMP_FUNCTION_TYPE)
3030 {
3031 mods->printed = 1;
3032 d_print_function_type (dpi, mods->mod, mods->next);
3033 return;
3034 }
3035 else if (mods->mod->type == D_COMP_ARRAY_TYPE)
3036 {
3037 mods->printed = 1;
3038 d_print_array_type (dpi, mods->mod, mods->next);
3039 return;
3040 }
3041
3042 mods->printed = 1;
3043
3044 d_print_mod (dpi, mods->mod);
3045
3046 d_print_mod_list (dpi, mods->next);
3047 }
3048
3049 /* Print a modifier. */
3050
3051 static void
3052 d_print_mod (dpi, mod)
3053 struct d_print_info *dpi;
3054 const struct d_comp *mod;
3055 {
3056 switch (mod->type)
3057 {
3058 case D_COMP_RESTRICT:
3059 d_append_string (dpi, " restrict");
3060 return;
3061 case D_COMP_VOLATILE:
3062 d_append_string (dpi, " volatile");
3063 return;
3064 case D_COMP_CONST:
3065 d_append_string (dpi, " const");
3066 return;
3067 case D_COMP_VENDOR_TYPE_QUAL:
3068 d_append_char (dpi, ' ');
3069 d_print_comp (dpi, d_right (mod));
3070 return;
3071 case D_COMP_POINTER:
3072 /* There is no pointer symbol in Java. */
3073 if ((dpi->options & DMGL_JAVA) == 0)
3074 d_append_char (dpi, '*');
3075 return;
3076 case D_COMP_REFERENCE:
3077 d_append_char (dpi, '&');
3078 return;
3079 case D_COMP_COMPLEX:
3080 d_append_string (dpi, "complex ");
3081 return;
3082 case D_COMP_IMAGINARY:
3083 d_append_string (dpi, "imaginary ");
3084 return;
3085 case D_COMP_PTRMEM_TYPE:
3086 if (dpi->buf[dpi->len - 1] != '(')
3087 d_append_char (dpi, ' ');
3088 d_print_comp (dpi, d_left (mod));
3089 d_append_string (dpi, "::*");
3090 return;
3091 case D_COMP_TYPED_NAME:
3092 d_print_comp (dpi, d_left (mod));
3093 return;
3094 default:
3095 /* Otherwise, we have something that won't go back on the
3096 modifier stack, so we can just print it. */
3097 d_print_comp (dpi, mod);
3098 return;
3099 }
3100 }
3101
3102 /* Print a function type, except for the return type. */
3103
3104 static void
3105 d_print_function_type (dpi, dc, mods)
3106 struct d_print_info *dpi;
3107 const struct d_comp *dc;
3108 struct d_print_mod *mods;
3109 {
3110 if (mods != NULL)
3111 {
3112 int need_paren;
3113 int saw_mod;
3114 struct d_print_mod *p;
3115
3116 need_paren = 0;
3117 saw_mod = 0;
3118 for (p = mods; p != NULL; p = p->next)
3119 {
3120 if (p->printed)
3121 break;
3122
3123 saw_mod = 1;
3124 switch (p->mod->type)
3125 {
3126 case D_COMP_RESTRICT:
3127 case D_COMP_VOLATILE:
3128 case D_COMP_CONST:
3129 case D_COMP_VENDOR_TYPE_QUAL:
3130 case D_COMP_POINTER:
3131 case D_COMP_REFERENCE:
3132 case D_COMP_COMPLEX:
3133 case D_COMP_IMAGINARY:
3134 case D_COMP_PTRMEM_TYPE:
3135 need_paren = 1;
3136 break;
3137 default:
3138 break;
3139 }
3140 if (need_paren)
3141 break;
3142 }
3143
3144 if (d_left (dc) != NULL && ! saw_mod)
3145 need_paren = 1;
3146
3147 if (need_paren)
3148 d_append_char (dpi, '(');
3149
3150 d_print_mod_list (dpi, mods);
3151
3152 if (need_paren)
3153 d_append_char (dpi, ')');
3154 }
3155
3156 d_append_char (dpi, '(');
3157
3158 if (d_right (dc) != NULL)
3159 d_print_comp (dpi, d_right (dc));
3160
3161 d_append_char (dpi, ')');
3162 }
3163
3164 /* Print an array type, except for the element type. */
3165
3166 static void
3167 d_print_array_type (dpi, dc, mods)
3168 struct d_print_info *dpi;
3169 const struct d_comp *dc;
3170 struct d_print_mod *mods;
3171 {
3172 int need_space;
3173
3174 need_space = 1;
3175 if (mods != NULL)
3176 {
3177 int need_paren;
3178 struct d_print_mod *p;
3179
3180 need_paren = 0;
3181 for (p = mods; p != NULL; p = p->next)
3182 {
3183 if (p->printed)
3184 break;
3185
3186 if (p->mod->type == D_COMP_ARRAY_TYPE)
3187 {
3188 need_space = 0;
3189 break;
3190 }
3191 else
3192 {
3193 need_paren = 1;
3194 need_space = 1;
3195 break;
3196 }
3197 }
3198
3199 if (need_paren)
3200 d_append_string (dpi, " (");
3201
3202 d_print_mod_list (dpi, mods);
3203
3204 if (need_paren)
3205 d_append_char (dpi, ')');
3206 }
3207
3208 if (need_space)
3209 d_append_char (dpi, ' ');
3210
3211 d_append_char (dpi, '[');
3212
3213 if (d_left (dc) != NULL)
3214 d_print_comp (dpi, d_left (dc));
3215
3216 d_append_char (dpi, ']');
3217 }
3218
3219 /* Print an operator in an expression. */
3220
3221 static void
3222 d_print_expr_op (dpi, dc)
3223 struct d_print_info *dpi;
3224 const struct d_comp *dc;
3225 {
3226 if (dc->type == D_COMP_OPERATOR)
3227 d_append_string (dpi, dc->u.s_operator.op->name);
3228 else
3229 d_print_comp (dpi, dc);
3230 }
3231
3232 /* Print a cast. */
3233
3234 static void
3235 d_print_cast (dpi, dc)
3236 struct d_print_info *dpi;
3237 const struct d_comp *dc;
3238 {
3239 if (d_left (dc)->type != D_COMP_TEMPLATE)
3240 d_print_comp (dpi, d_left (dc));
3241 else
3242 {
3243 struct d_print_template dpt;
3244
3245 /* It appears that for a templated cast operator, we need to put
3246 the template parameters in scope for the operator name, but
3247 not for the parameters. The effect is that we need to handle
3248 the template printing here. FIXME: Verify this. */
3249
3250 dpt.next = dpi->templates;
3251 dpi->templates = &dpt;
3252 dpt.template = d_left (dc);
3253
3254 d_print_comp (dpi, d_left (d_left (dc)));
3255
3256 dpi->templates = dpt.next;
3257
3258 d_append_char (dpi, '<');
3259 d_print_comp (dpi, d_right (d_left (dc)));
3260 /* Avoid generating two consecutive '>' characters, to avoid
3261 the C++ syntactic ambiguity. */
3262 if (dpi->buf[dpi->len - 1] == '>')
3263 d_append_char (dpi, ' ');
3264 d_append_char (dpi, '>');
3265 }
3266 }
3267
3268 /* Initialize the information structure we use to pass around
3269 information. */
3270
3271 static int
3272 d_init_info (mangled, options, len, di)
3273 const char *mangled;
3274 int options;
3275 size_t len;
3276 struct d_info *di;
3277 {
3278 di->s = mangled;
3279 di->options = options;
3280
3281 di->n = mangled;
3282
3283 /* We can not need more components than twice the number of chars in
3284 the mangled string. Most components correspond directly to
3285 chars, but the ARGLIST types are exceptions. */
3286 di->num_comps = 2 * len;
3287 di->comps = (struct d_comp *) malloc (di->num_comps
3288 * sizeof (struct d_comp));
3289 di->next_comp = 0;
3290
3291 /* Similarly, we can not need more substitutions than there are
3292 chars in the mangled string divided by 2, since it takes at least
3293 two chars to refer to a substitution. */
3294 di->num_subs = (len + 1) / 2;
3295 di->subs = (struct d_comp **) malloc (di->num_subs
3296 * sizeof (struct d_comp *));
3297 di->next_sub = 0;
3298
3299 di->last_name = NULL;
3300
3301 if (di->comps == NULL || di->subs == NULL)
3302 {
3303 if (di->comps != NULL)
3304 free (di->comps);
3305 if (di->subs != NULL)
3306 free (di->subs);
3307 return 0;
3308 }
3309
3310 return 1;
3311 }
3312
3313 /* Entry point for the demangler. If MANGLED is a g++ v3 ABI mangled
3314 name, return a buffer allocated with malloc holding the demangled
3315 name. OPTIONS is the usual libiberty demangler options. On
3316 success, this sets *PALC to the allocated size of the returned
3317 buffer. On failure, this sets *PALC to 0 for a bad name, or 1 for
3318 a memory allocation failure. On failure, this returns NULL. */
3319
3320 static char *
3321 d_demangle (mangled, options, palc)
3322 const char* mangled;
3323 int options;
3324 size_t *palc;
3325 {
3326 size_t len;
3327 int type;
3328 struct d_info di;
3329 struct d_comp *dc;
3330 char *ret;
3331
3332 *palc = 0;
3333
3334 len = strlen (mangled);
3335
3336 if (mangled[0] == '_' && mangled[1] == 'Z')
3337 type = 0;
3338 else if (strncmp (mangled, "_GLOBAL_", 8) == 0
3339 && (mangled[8] == '.' || mangled[8] == '_' || mangled[8] == '$')
3340 && (mangled[9] == 'D' || mangled[9] == 'I')
3341 && mangled[10] == '_')
3342 {
3343 char *r;
3344
3345 r = malloc (40 + len - 11);
3346 if (r == NULL)
3347 *palc = 1;
3348 else
3349 {
3350 if (mangled[9] == 'I')
3351 strcpy (r, "global constructors keyed to ");
3352 else
3353 strcpy (r, "global destructors keyed to ");
3354 strcat (r, mangled + 11);
3355 }
3356 return r;
3357 }
3358 else
3359 {
3360 if ((options & DMGL_TYPES) == 0)
3361 return NULL;
3362 type = 1;
3363 }
3364
3365 if (! d_init_info (mangled, options, len, &di))
3366 {
3367 *palc = 1;
3368 return NULL;
3369 }
3370
3371 if (! type)
3372 dc = d_mangled_name (&di);
3373 else
3374 dc = d_type (&di);
3375
3376 #ifdef CP_DEMANGLE_DEBUG
3377 if (dc == NULL)
3378 printf ("failed demangling\n");
3379 else
3380 d_dump (dc, 0);
3381 #endif
3382
3383 free (di.subs);
3384 di.subs = NULL;
3385
3386 ret = NULL;
3387 if (dc != NULL)
3388 ret = d_print (options, dc, palc);
3389
3390 free (di.comps);
3391
3392 return ret;
3393 }
3394
3395 #if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3)
3396
3397 extern char *__cxa_demangle PARAMS ((const char *, char *, size_t *, int *));
3398
3399 /* ia64 ABI-mandated entry point in the C++ runtime library for
3400 performing demangling. MANGLED_NAME is a NUL-terminated character
3401 string containing the name to be demangled.
3402
3403 OUTPUT_BUFFER is a region of memory, allocated with malloc, of
3404 *LENGTH bytes, into which the demangled name is stored. If
3405 OUTPUT_BUFFER is not long enough, it is expanded using realloc.
3406 OUTPUT_BUFFER may instead be NULL; in that case, the demangled name
3407 is placed in a region of memory allocated with malloc.
3408
3409 If LENGTH is non-NULL, the length of the buffer conaining the
3410 demangled name, is placed in *LENGTH.
3411
3412 The return value is a pointer to the start of the NUL-terminated
3413 demangled name, or NULL if the demangling fails. The caller is
3414 responsible for deallocating this memory using free.
3415
3416 *STATUS is set to one of the following values:
3417 0: The demangling operation succeeded.
3418 -1: A memory allocation failure occurred.
3419 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
3420 -3: One of the arguments is invalid.
3421
3422 The demangling is performed using the C++ ABI mangling rules, with
3423 GNU extensions. */
3424
3425 char *
3426 __cxa_demangle (mangled_name, output_buffer, length, status)
3427 const char *mangled_name;
3428 char *output_buffer;
3429 size_t *length;
3430 int *status;
3431 {
3432 char *demangled;
3433 size_t alc;
3434
3435 if (status == NULL)
3436 return NULL;
3437
3438 if (mangled_name == NULL)
3439 {
3440 *status = -3;
3441 return NULL;
3442 }
3443
3444 if (output_buffer != NULL && length == NULL)
3445 {
3446 *status = -3;
3447 return NULL;
3448 }
3449
3450 demangled = d_demangle (mangled_name, DMGL_TYPES, &alc);
3451
3452 if (demangled == NULL)
3453 {
3454 if (alc == 1)
3455 *status = -1;
3456 else
3457 *status = -2;
3458 return NULL;
3459 }
3460
3461 if (output_buffer == NULL)
3462 {
3463 if (length != NULL)
3464 *length = alc;
3465 }
3466 else
3467 {
3468 if (strlen (demangled) < *length)
3469 {
3470 strcpy (output_buffer, demangled);
3471 free (demangled);
3472 demangled = output_buffer;
3473 }
3474 else
3475 {
3476 free (output_buffer);
3477 *length = alc;
3478 }
3479 }
3480
3481 *status = 0;
3482
3483 return demangled;
3484 }
3485
3486 #else /* ! (IN_LIBGCC2 || IN_GLIBCPP_V3) */
3487
3488 /* Entry point for libiberty demangler. If MANGLED is a g++ v3 ABI
3489 mangled name, return a buffer allocated with malloc holding the
3490 demangled name. Otherwise, return NULL. */
3491
3492 char *
3493 cplus_demangle_v3 (mangled, options)
3494 const char* mangled;
3495 int options;
3496 {
3497 size_t alc;
3498
3499 return d_demangle (mangled, options, &alc);
3500 }
3501
3502 /* Demangle a Java symbol. Java uses a subset of the V3 ABI C++ mangling
3503 conventions, but the output formatting is a little different.
3504 This instructs the C++ demangler not to emit pointer characters ("*"), and
3505 to use Java's namespace separator symbol ("." instead of "::"). It then
3506 does an additional pass over the demangled output to replace instances
3507 of JArray<TYPE> with TYPE[]. */
3508
3509 char *
3510 java_demangle_v3 (mangled)
3511 const char* mangled;
3512 {
3513 size_t alc;
3514 char *demangled;
3515 int nesting;
3516 char *from;
3517 char *to;
3518
3519 demangled = d_demangle (mangled, DMGL_JAVA, &alc);
3520
3521 if (demangled == NULL)
3522 return NULL;
3523
3524 nesting = 0;
3525 from = demangled;
3526 to = from;
3527 while (*from != '\0')
3528 {
3529 if (strncmp (from, "JArray<", 7) == 0)
3530 {
3531 from += 7;
3532 ++nesting;
3533 }
3534 else if (nesting > 0 && *from == '>')
3535 {
3536 while (to > demangled && to[-1] == ' ')
3537 --to;
3538 *to++ = '[';
3539 *to++ = ']';
3540 --nesting;
3541 ++from;
3542 }
3543 else
3544 *to++ = *from++;
3545 }
3546
3547 *to = '\0';
3548
3549 return demangled;
3550 }
3551
3552 #endif /* IN_LIBGCC2 || IN_GLIBCPP_V3 */
3553
3554 #ifndef IN_GLIBCPP_V3
3555
3556 /* Demangle a string in order to find out whether it is a constructor
3557 or destructor. Return non-zero on success. Set *CTOR_KIND and
3558 *DTOR_KIND appropriately. */
3559
3560 static int
3561 is_ctor_or_dtor (mangled, ctor_kind, dtor_kind)
3562 const char *mangled;
3563 enum gnu_v3_ctor_kinds *ctor_kind;
3564 enum gnu_v3_dtor_kinds *dtor_kind;
3565 {
3566 struct d_info di;
3567 struct d_comp *dc;
3568
3569 *ctor_kind = (enum gnu_v3_ctor_kinds) 0;
3570 *dtor_kind = (enum gnu_v3_dtor_kinds) 0;
3571
3572 if (! d_init_info (mangled, DMGL_GNU_V3, strlen (mangled), &di))
3573 return 0;
3574
3575 dc = d_mangled_name (&di);
3576
3577 if (dc == NULL)
3578 return 0;
3579
3580 while (dc != NULL)
3581 {
3582 switch (dc->type)
3583 {
3584 default:
3585 return 0;
3586 case D_COMP_TYPED_NAME:
3587 case D_COMP_TEMPLATE:
3588 case D_COMP_RESTRICT:
3589 case D_COMP_VOLATILE:
3590 case D_COMP_CONST:
3591 case D_COMP_VENDOR_TYPE_QUAL:
3592 dc = d_left (dc);
3593 break;
3594 case D_COMP_QUAL_NAME:
3595 dc = d_right (dc);
3596 break;
3597 case D_COMP_CTOR:
3598 *ctor_kind = dc->u.s_ctor.kind;
3599 return 1;
3600 case D_COMP_DTOR:
3601 *dtor_kind = dc->u.s_dtor.kind;
3602 return 1;
3603 }
3604 }
3605
3606 return 0;
3607 }
3608
3609 /* Return whether NAME is the mangled form of a g++ V3 ABI constructor
3610 name. A non-zero return indicates the type of constructor. */
3611
3612 enum gnu_v3_ctor_kinds
3613 is_gnu_v3_mangled_ctor (name)
3614 const char *name;
3615 {
3616 enum gnu_v3_ctor_kinds ctor_kind;
3617 enum gnu_v3_dtor_kinds dtor_kind;
3618
3619 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
3620 return (enum gnu_v3_ctor_kinds) 0;
3621 return ctor_kind;
3622 }
3623
3624
3625 /* Return whether NAME is the mangled form of a g++ V3 ABI destructor
3626 name. A non-zero return indicates the type of destructor. */
3627
3628 enum gnu_v3_dtor_kinds
3629 is_gnu_v3_mangled_dtor (name)
3630 const char *name;
3631 {
3632 enum gnu_v3_ctor_kinds ctor_kind;
3633 enum gnu_v3_dtor_kinds dtor_kind;
3634
3635 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
3636 return (enum gnu_v3_dtor_kinds) 0;
3637 return dtor_kind;
3638 }
3639
3640 #endif /* IN_GLIBCPP_V3 */
3641
3642 #ifdef STANDALONE_DEMANGLER
3643
3644 #include "getopt.h"
3645 #include "dyn-string.h"
3646
3647 static void print_usage PARAMS ((FILE* fp, int exit_value));
3648
3649 #define IS_ALPHA(CHAR) \
3650 (((CHAR) >= 'a' && (CHAR) <= 'z') \
3651 || ((CHAR) >= 'A' && (CHAR) <= 'Z'))
3652
3653 /* Non-zero if CHAR is a character than can occur in a mangled name. */
3654 #define is_mangled_char(CHAR) \
3655 (IS_ALPHA (CHAR) || IS_DIGIT (CHAR) \
3656 || (CHAR) == '_' || (CHAR) == '.' || (CHAR) == '$')
3657
3658 /* The name of this program, as invoked. */
3659 const char* program_name;
3660
3661 /* Prints usage summary to FP and then exits with EXIT_VALUE. */
3662
3663 static void
3664 print_usage (fp, exit_value)
3665 FILE* fp;
3666 int exit_value;
3667 {
3668 fprintf (fp, "Usage: %s [options] [names ...]\n", program_name);
3669 fprintf (fp, "Options:\n");
3670 fprintf (fp, " -h,--help Display this message.\n");
3671 fprintf (fp, " -v,--verbose Produce verbose demanglings.\n");
3672 fprintf (fp, "If names are provided, they are demangled. Otherwise filters standard input.\n");
3673
3674 exit (exit_value);
3675 }
3676
3677 /* Option specification for getopt_long. */
3678 static const struct option long_options[] =
3679 {
3680 { "help", no_argument, NULL, 'h' },
3681 { "verbose", no_argument, NULL, 'v' },
3682 { NULL, no_argument, NULL, 0 },
3683 };
3684
3685 /* Main entry for a demangling filter executable. It will demangle
3686 its command line arguments, if any. If none are provided, it will
3687 filter stdin to stdout, replacing any recognized mangled C++ names
3688 with their demangled equivalents. */
3689
3690 int
3691 main (argc, argv)
3692 int argc;
3693 char *argv[];
3694 {
3695 int i;
3696 int opt_char;
3697 int options = DMGL_PARAMS | DMGL_ANSI | DMGL_TYPES;
3698
3699 /* Use the program name of this program, as invoked. */
3700 program_name = argv[0];
3701
3702 /* Parse options. */
3703 do
3704 {
3705 opt_char = getopt_long (argc, argv, "hv", long_options, NULL);
3706 switch (opt_char)
3707 {
3708 case '?': /* Unrecognized option. */
3709 print_usage (stderr, 1);
3710 break;
3711
3712 case 'h':
3713 print_usage (stdout, 0);
3714 break;
3715
3716 case 'v':
3717 options |= DMGL_VERBOSE;
3718 break;
3719 }
3720 }
3721 while (opt_char != -1);
3722
3723 if (optind == argc)
3724 /* No command line arguments were provided. Filter stdin. */
3725 {
3726 dyn_string_t mangled = dyn_string_new (3);
3727 char *s;
3728
3729 /* Read all of input. */
3730 while (!feof (stdin))
3731 {
3732 char c;
3733
3734 /* Pile characters into mangled until we hit one that can't
3735 occur in a mangled name. */
3736 c = getchar ();
3737 while (!feof (stdin) && is_mangled_char (c))
3738 {
3739 dyn_string_append_char (mangled, c);
3740 if (feof (stdin))
3741 break;
3742 c = getchar ();
3743 }
3744
3745 if (dyn_string_length (mangled) > 0)
3746 {
3747 s = cplus_demangle_v3 (dyn_string_buf (mangled), options);
3748
3749 if (s != NULL)
3750 {
3751 fputs (s, stdout);
3752 free (s);
3753 }
3754 else
3755 {
3756 /* It might not have been a mangled name. Print the
3757 original text. */
3758 fputs (dyn_string_buf (mangled), stdout);
3759 }
3760
3761 dyn_string_clear (mangled);
3762 }
3763
3764 /* If we haven't hit EOF yet, we've read one character that
3765 can't occur in a mangled name, so print it out. */
3766 if (!feof (stdin))
3767 putchar (c);
3768 }
3769
3770 dyn_string_delete (mangled);
3771 }
3772 else
3773 /* Demangle command line arguments. */
3774 {
3775 /* Loop over command line arguments. */
3776 for (i = optind; i < argc; ++i)
3777 {
3778 char *s;
3779
3780 /* Attempt to demangle. */
3781 s = cplus_demangle_v3 (argv[i], options);
3782
3783 /* If it worked, print the demangled name. */
3784 if (s != NULL)
3785 {
3786 printf ("%s\n", s);
3787 free (s);
3788 }
3789 else
3790 fprintf (stderr, "Failed: %s\n", argv[i]);
3791 }
3792 }
3793
3794 return 0;
3795 }
3796
3797 #endif /* STANDALONE_DEMANGLER */
This page took 0.176755 seconds and 4 git commands to generate.