OpenCores
URL https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk

Subversion Repositories openrisc_2011-10-31

[/] [openrisc/] [trunk/] [gnu-src/] [binutils-2.18.50/] [libiberty/] [cp-demangle.c] - Blame information for rev 309

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

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

powered by: WebSVN 2.1.0

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