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 161

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

powered by: WebSVN 2.1.0

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