[BACK]Return to cp-demangle.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / external / gpl3 / binutils / dist / libiberty

Annotation of src/external/gpl3/binutils/dist/libiberty/cp-demangle.c, Revision 1.1.1.2.8.1

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

CVSweb <webmaster@jp.NetBSD.org>