~ubuntu-branches/ubuntu/vivid/emscripten/vivid

« back to all changes in this revision

Viewing changes to third_party/gcc_demangler.c

  • Committer: Package Import Robot
  • Author(s): Sylvestre Ledru
  • Date: 2013-05-02 13:11:51 UTC
  • Revision ID: package-import@ubuntu.com-20130502131151-q8dvteqr1ef2x7xz
Tags: upstream-1.4.1~20130504~adb56cb
ImportĀ upstreamĀ versionĀ 1.4.1~20130504~adb56cb

Show diffs side-by-side

added added

removed removed

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