OpenCores
URL https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [libiberty/] [cp-demangle.c] - Blame information for rev 32

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.