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

Subversion Repositories open8_urisc

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

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

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

powered by: WebSVN 2.1.0

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