Home | History | Annotate | Download | only in symbolize
      1 // Copyright (c) 2006, Google Inc.
      2 // All rights reserved.
      3 //
      4 // Redistribution and use in source and binary forms, with or without
      5 // modification, are permitted provided that the following conditions are
      6 // met:
      7 //
      8 //     * Redistributions of source code must retain the above copyright
      9 // notice, this list of conditions and the following disclaimer.
     10 //     * Redistributions in binary form must reproduce the above
     11 // copyright notice, this list of conditions and the following disclaimer
     12 // in the documentation and/or other materials provided with the
     13 // distribution.
     14 //     * Neither the name of Google Inc. nor the names of its
     15 // contributors may be used to endorse or promote products derived from
     16 // this software without specific prior written permission.
     17 //
     18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29 //
     30 // Author: Satoru Takabayashi
     31 
     32 #include <stdio.h>  // for NULL
     33 #include "demangle.h"
     34 
     35 _START_GOOGLE_NAMESPACE_
     36 
     37 typedef struct {
     38   const char *abbrev;
     39   const char *real_name;
     40 } AbbrevPair;
     41 
     42 // List of operators from Itanium C++ ABI.
     43 static const AbbrevPair kOperatorList[] = {
     44   { "nw", "new" },
     45   { "na", "new[]" },
     46   { "dl", "delete" },
     47   { "da", "delete[]" },
     48   { "ps", "+" },
     49   { "ng", "-" },
     50   { "ad", "&" },
     51   { "de", "*" },
     52   { "co", "~" },
     53   { "pl", "+" },
     54   { "mi", "-" },
     55   { "ml", "*" },
     56   { "dv", "/" },
     57   { "rm", "%" },
     58   { "an", "&" },
     59   { "or", "|" },
     60   { "eo", "^" },
     61   { "aS", "=" },
     62   { "pL", "+=" },
     63   { "mI", "-=" },
     64   { "mL", "*=" },
     65   { "dV", "/=" },
     66   { "rM", "%=" },
     67   { "aN", "&=" },
     68   { "oR", "|=" },
     69   { "eO", "^=" },
     70   { "ls", "<<" },
     71   { "rs", ">>" },
     72   { "lS", "<<=" },
     73   { "rS", ">>=" },
     74   { "eq", "==" },
     75   { "ne", "!=" },
     76   { "lt", "<" },
     77   { "gt", ">" },
     78   { "le", "<=" },
     79   { "ge", ">=" },
     80   { "nt", "!" },
     81   { "aa", "&&" },
     82   { "oo", "||" },
     83   { "pp", "++" },
     84   { "mm", "--" },
     85   { "cm", "," },
     86   { "pm", "->*" },
     87   { "pt", "->" },
     88   { "cl", "()" },
     89   { "ix", "[]" },
     90   { "qu", "?" },
     91   { "st", "sizeof" },
     92   { "sz", "sizeof" },
     93   { NULL, NULL },
     94 };
     95 
     96 // List of builtin types from Itanium C++ ABI.
     97 static const AbbrevPair kBuiltinTypeList[] = {
     98   { "v", "void" },
     99   { "w", "wchar_t" },
    100   { "b", "bool" },
    101   { "c", "char" },
    102   { "a", "signed char" },
    103   { "h", "unsigned char" },
    104   { "s", "short" },
    105   { "t", "unsigned short" },
    106   { "i", "int" },
    107   { "j", "unsigned int" },
    108   { "l", "long" },
    109   { "m", "unsigned long" },
    110   { "x", "long long" },
    111   { "y", "unsigned long long" },
    112   { "n", "__int128" },
    113   { "o", "unsigned __int128" },
    114   { "f", "float" },
    115   { "d", "double" },
    116   { "e", "long double" },
    117   { "g", "__float128" },
    118   { "z", "ellipsis" },
    119   { NULL, NULL }
    120 };
    121 
    122 // List of substitutions Itanium C++ ABI.
    123 static const AbbrevPair kSubstitutionList[] = {
    124   { "St", "" },
    125   { "Sa", "allocator" },
    126   { "Sb", "basic_string" },
    127   // std::basic_string<char, std::char_traits<char>,std::allocator<char> >
    128   { "Ss", "string"},
    129   // std::basic_istream<char, std::char_traits<char> >
    130   { "Si", "istream" },
    131   // std::basic_ostream<char, std::char_traits<char> >
    132   { "So", "ostream" },
    133   // std::basic_iostream<char, std::char_traits<char> >
    134   { "Sd", "iostream" },
    135   { NULL, NULL }
    136 };
    137 
    138 // State needed for demangling.
    139 typedef struct {
    140   const char *mangled_cur;  // Cursor of mangled name.
    141   const char *mangled_end;  // End of mangled name.
    142   char *out_cur;            // Cursor of output string.
    143   const char *out_begin;    // Beginning of output string.
    144   const char *out_end;      // End of output string.
    145   const char *prev_name;    // For constructors/destructors.
    146   int prev_name_length;     // For constructors/destructors.
    147   int nest_level;           // For nested names.
    148   int number;               // Remember the previous number.
    149   bool append;              // Append flag.
    150   bool overflowed;          // True if output gets overflowed.
    151 } State;
    152 
    153 // We don't use strlen() in libc since it's not guaranteed to be async
    154 // signal safe.
    155 static size_t StrLen(const char *str) {
    156   size_t len = 0;
    157   while (*str != '\0') {
    158     ++str;
    159     ++len;
    160   }
    161   return len;
    162 }
    163 
    164 // Returns true if "str" has "prefix" as a prefix.
    165 static bool StrPrefix(const char *str, const char *prefix) {
    166   size_t i = 0;
    167   while (str[i] != '\0' && prefix[i] != '\0' &&
    168          str[i] == prefix[i]) {
    169     ++i;
    170   }
    171   return prefix[i] == '\0';  // Consumed everything in "prefix".
    172 }
    173 
    174 static void InitState(State *state, const char *mangled,
    175                       char *out, int out_size) {
    176   state->mangled_cur = mangled;
    177   state->mangled_end = mangled + StrLen(mangled);
    178   state->out_cur = out;
    179   state->out_begin = out;
    180   state->out_end = out + out_size;
    181   state->prev_name  = NULL;
    182   state->prev_name_length = -1;
    183   state->nest_level = -1;
    184   state->number = -1;
    185   state->append = true;
    186   state->overflowed = false;
    187 }
    188 
    189 // Calculates the remaining length of the mangled name.
    190 static int RemainingLength(State *state) {
    191   return state->mangled_end - state->mangled_cur;
    192 }
    193 
    194 // Returns true and advances "mangled_cur" if we find "c" at
    195 // "mangled_cur" position.
    196 static bool ParseChar(State *state, const char c) {
    197   if (RemainingLength(state) >= 1 && *state->mangled_cur == c) {
    198     ++state->mangled_cur;
    199     return true;
    200   }
    201   return false;
    202 }
    203 
    204 // Returns true and advances "mangled_cur" if we find "two_chars" at
    205 // "mangled_cur" position.
    206 static bool ParseTwoChar(State *state, const char *two_chars) {
    207   if (RemainingLength(state) >= 2 &&
    208       state->mangled_cur[0] == two_chars[0] &&
    209       state->mangled_cur[1] == two_chars[1]) {
    210     state->mangled_cur += 2;
    211     return true;
    212   }
    213   return false;
    214 }
    215 
    216 // Returns true and advances "mangled_cur" if we find any character in
    217 // "char_class" at "mangled_cur" position.
    218 static bool ParseCharClass(State *state, const char *char_class) {
    219   if (state->mangled_cur == state->mangled_end) {
    220     return false;
    221   }
    222   const char *p = char_class;
    223   for (; *p != '\0'; ++p) {
    224     if (*state->mangled_cur == *p) {
    225       state->mangled_cur += 1;
    226       return true;
    227     }
    228   }
    229   return false;
    230 }
    231 
    232 // This function is used for handling an optional non-terminal.
    233 static bool Optional(bool status) {
    234   return true;
    235 }
    236 
    237 // This function is used for handling <non-terminal>+ syntax.
    238 typedef bool (*ParseFunc)(State *);
    239 static bool OneOrMore(ParseFunc parse_func, State *state) {
    240   if (parse_func(state)) {
    241     while (parse_func(state)) {
    242     }
    243     return true;
    244   }
    245   return false;
    246 }
    247 
    248 // Append "str" at "out_cur".  If there is an overflow, "overflowed"
    249 // is set to true for later use.  The output string is ensured to
    250 // always terminate with '\0' as long as there is no overflow.
    251 static void Append(State *state, const char * const str, const int length) {
    252   int i;
    253   for (i = 0; i < length; ++i) {
    254     if (state->out_cur + 1 < state->out_end) {  // +1 for '\0'
    255       *state->out_cur = str[i];
    256       ++state->out_cur;
    257     } else {
    258       state->overflowed = true;
    259       break;
    260     }
    261   }
    262   if (!state->overflowed) {
    263     *state->out_cur = '\0';  // Terminate it with '\0'
    264   }
    265 }
    266 
    267 // We don't use equivalents in libc to avoid locale issues.
    268 static bool IsLower(char c) {
    269   return c >= 'a' && c <= 'z';
    270 }
    271 
    272 static bool IsAlpha(char c) {
    273   return ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'));
    274 }
    275 
    276 // Append "str" with some tweaks, iff "append" state is true.
    277 // Returns true so that it can be placed in "if" conditions.
    278 static void MaybeAppendWithLength(State *state, const char * const str,
    279                                   const int length) {
    280   if (state->append && length > 0) {
    281     // Append a space if the output buffer ends with '<' and "str"
    282     // starts with '<' to avoid <<<.
    283     if (str[0] == '<' && state->out_begin < state->out_cur  &&
    284         state->out_cur[-1] == '<') {
    285       Append(state, " ", 1);
    286     }
    287     // Remember the last identifier name for ctors/dtors.
    288     if (IsAlpha(str[0]) || str[0] == '_') {
    289       state->prev_name = state->out_cur;
    290       state->prev_name_length = length;
    291     }
    292     Append(state, str, length);
    293   }
    294 }
    295 
    296 // A convenient wrapper arount MaybeAppendWithLength().
    297 static bool MaybeAppend(State *state, const char * const str) {
    298   if (state->append) {
    299     int length = StrLen(str);
    300     MaybeAppendWithLength(state, str, length);
    301   }
    302   return true;
    303 }
    304 
    305 // This function is used for handling nested names.
    306 static bool EnterNestedName(State *state) {
    307   state->nest_level = 0;
    308   return true;
    309 }
    310 
    311 // This function is used for handling nested names.
    312 static bool LeaveNestedName(State *state, int prev_value) {
    313   state->nest_level = prev_value;
    314   return true;
    315 }
    316 
    317 // Disable the append mode not to print function parameters, etc.
    318 static bool DisableAppend(State *state) {
    319   state->append = false;
    320   return true;
    321 }
    322 
    323 // Restore the append mode to the previous state.
    324 static bool RestoreAppend(State *state, bool prev_value) {
    325   state->append = prev_value;
    326   return true;
    327 }
    328 
    329 // Increase the nest level for nested names.
    330 static void MaybeIncreaseNestLevel(State *state) {
    331   if (state->nest_level > -1) {
    332     ++state->nest_level;
    333   }
    334 }
    335 
    336 // Appends :: for nested names if necessary.
    337 static void MaybeAppendSeparator(State *state) {
    338   if (state->nest_level >= 1) {
    339     MaybeAppend(state, "::");
    340   }
    341 }
    342 
    343 // Cancel the last separator if necessary.
    344 static void MaybeCancelLastSeparator(State *state) {
    345   if (state->nest_level >= 1 && state->append &&
    346       state->out_begin <= state->out_cur - 2) {
    347     state->out_cur -= 2;
    348     *state->out_cur = '\0';
    349   }
    350 }
    351 
    352 // Returns true if identifier pointed by "mangled_cur" is anonymous
    353 // namespace.
    354 static bool IdentifierIsAnonymousNamespace(State *state) {
    355   const char anon_prefix[] = "_GLOBAL__N_";
    356   return (state->number > sizeof(anon_prefix) - 1 &&  // Should be longer.
    357           StrPrefix(state->mangled_cur, anon_prefix));
    358 }
    359 
    360 // Forward declarations of our parsing functions.
    361 static bool ParseMangledName(State *state);
    362 static bool ParseEncoding(State *state);
    363 static bool ParseName(State *state);
    364 static bool ParseUnscopedName(State *state);
    365 static bool ParseUnscopedTemplateName(State *state);
    366 static bool ParseNestedName(State *state);
    367 static bool ParsePrefix(State *state);
    368 static bool ParseUnqualifiedName(State *state);
    369 static bool ParseSourceName(State *state);
    370 static bool ParseLocalSourceName(State *state);
    371 static bool ParseNumber(State *state);
    372 static bool ParseFloatNumber(State *state);
    373 static bool ParseSeqId(State *state);
    374 static bool ParseIdentifier(State *state);
    375 static bool ParseOperatorName(State *state);
    376 static bool ParseSpecialName(State *state);
    377 static bool ParseCallOffset(State *state);
    378 static bool ParseNVOffset(State *state);
    379 static bool ParseVOffset(State *state);
    380 static bool ParseCtorDtorName(State *state);
    381 static bool ParseType(State *state);
    382 static bool ParseCVQualifiers(State *state);
    383 static bool ParseBuiltinType(State *state);
    384 static bool ParseFunctionType(State *state);
    385 static bool ParseBareFunctionType(State *state);
    386 static bool ParseClassEnumType(State *state);
    387 static bool ParseArrayType(State *state);
    388 static bool ParsePointerToMemberType(State *state);
    389 static bool ParseTemplateParam(State *state);
    390 static bool ParseTemplateTemplateParam(State *state);
    391 static bool ParseTemplateArgs(State *state);
    392 static bool ParseTemplateArg(State *state);
    393 static bool ParseExpression(State *state);
    394 static bool ParseExprPrimary(State *state);
    395 static bool ParseLocalName(State *state);
    396 static bool ParseDiscriminator(State *state);
    397 static bool ParseSubstitution(State *state);
    398 
    399 // Implementation note: the following code is a straightforward
    400 // translation of the Itanium C++ ABI defined in BNF with a couple of
    401 // exceptions.
    402 //
    403 // - Support GNU extensions not defined in the Itanium C++ ABI
    404 // - <prefix> and <template-prefix> are combined to avoid infinite loop
    405 // - Reorder patterns to shorten the code
    406 // - Reorder patterns to give greedier functions precedence
    407 //   We'll mark "Less greedy than" for these cases in the code
    408 //
    409 // Each parsing function changes the state and returns true on
    410 // success.  Otherwise, don't change the state and returns false.  To
    411 // ensure that the state isn't changed in the latter case, we save the
    412 // original state before we call more than one parsing functions
    413 // consecutively with &&, and restore the state if unsuccessful.  See
    414 // ParseEncoding() as an example of this convention.  We follow the
    415 // convention throughout the code.
    416 //
    417 // Originally we tried to do demangling without following the full ABI
    418 // syntax but it turned out we needed to follow the full syntax to
    419 // parse complicated cases like nested template arguments.  Note that
    420 // implementing a full-fledged demangler isn't trivial (libiberty's
    421 // cp-demangle.c has +4300 lines).
    422 //
    423 // Note that (foo) in <(foo) ...> is a modifier to be ignored.
    424 //
    425 // Reference:
    426 // - Itanium C++ ABI
    427 //   <http://www.codesourcery.com/cxx-abi/abi.html#mangling>
    428 
    429 // <mangled-name> ::= _Z <encoding>
    430 static bool ParseMangledName(State *state) {
    431   if (ParseTwoChar(state, "_Z") && ParseEncoding(state)) {
    432     // Append trailing version suffix if any.
    433     // ex. _Z3foo@@GLIBCXX_3.4
    434     if (state->mangled_cur < state->mangled_end &&
    435         state->mangled_cur[0] == '@') {
    436       MaybeAppend(state, state->mangled_cur);
    437       state->mangled_cur = state->mangled_end;
    438     }
    439     return true;
    440   }
    441   return false;
    442 }
    443 
    444 // <encoding> ::= <(function) name> <bare-function-type>
    445 //            ::= <(data) name>
    446 //            ::= <special-name>
    447 static bool ParseEncoding(State *state) {
    448   State copy = *state;
    449   if (ParseName(state) && ParseBareFunctionType(state)) {
    450     return true;
    451   }
    452   *state = copy;
    453 
    454   if (ParseName(state) || ParseSpecialName(state)) {
    455     return true;
    456   }
    457   return false;
    458 }
    459 
    460 // <name> ::= <nested-name>
    461 //        ::= <unscoped-template-name> <template-args>
    462 //        ::= <unscoped-name>
    463 //        ::= <local-name>
    464 static bool ParseName(State *state) {
    465   if (ParseNestedName(state) || ParseLocalName(state)) {
    466     return true;
    467   }
    468 
    469   State copy = *state;
    470   if (ParseUnscopedTemplateName(state) &&
    471       ParseTemplateArgs(state)) {
    472     return true;
    473   }
    474   *state = copy;
    475 
    476   // Less greedy than <unscoped-template-name> <template-args>.
    477   if (ParseUnscopedName(state)) {
    478     return true;
    479   }
    480   return false;
    481 }
    482 
    483 // <unscoped-name> ::= <unqualified-name>
    484 //                 ::= St <unqualified-name>
    485 static bool ParseUnscopedName(State *state) {
    486   if (ParseUnqualifiedName(state)) {
    487     return true;
    488   }
    489 
    490   State copy = *state;
    491   if (ParseTwoChar(state, "St") &&
    492       MaybeAppend(state, "std::") &&
    493       ParseUnqualifiedName(state)) {
    494     return true;
    495   }
    496   *state = copy;
    497   return false;
    498 }
    499 
    500 // <unscoped-template-name> ::= <unscoped-name>
    501 //                          ::= <substitution>
    502 static bool ParseUnscopedTemplateName(State *state) {
    503   return ParseUnscopedName(state) || ParseSubstitution(state);
    504 }
    505 
    506 // <nested-name> ::= N [<CV-qualifiers>] <prefix> <unqualified-name> E
    507 //               ::= N [<CV-qualifiers>] <template-prefix> <template-args> E
    508 static bool ParseNestedName(State *state) {
    509   State copy = *state;
    510   if (ParseChar(state, 'N') &&
    511       EnterNestedName(state) &&
    512       Optional(ParseCVQualifiers(state)) &&
    513       ParsePrefix(state) &&
    514       LeaveNestedName(state, copy.nest_level) &&
    515       ParseChar(state, 'E')) {
    516     return true;
    517   }
    518   *state = copy;
    519   return false;
    520 }
    521 
    522 // This part is tricky.  If we literally translate them to code, we'll
    523 // end up infinite loop.  Hence we merge them to avoid the case.
    524 //
    525 // <prefix> ::= <prefix> <unqualified-name>
    526 //          ::= <template-prefix> <template-args>
    527 //          ::= <template-param>
    528 //          ::= <substitution>
    529 //          ::= # empty
    530 // <template-prefix> ::= <prefix> <(template) unqualified-name>
    531 //                   ::= <template-param>
    532 //                   ::= <substitution>
    533 static bool ParsePrefix(State *state) {
    534   bool has_something = false;
    535   while (true) {
    536     MaybeAppendSeparator(state);
    537     if (ParseTemplateParam(state) ||
    538         ParseSubstitution(state) ||
    539         ParseUnscopedName(state)) {
    540       has_something = true;
    541       MaybeIncreaseNestLevel(state);
    542       continue;
    543     }
    544     MaybeCancelLastSeparator(state);
    545     if (has_something && ParseTemplateArgs(state)) {
    546       return ParsePrefix(state);
    547     } else {
    548       break;
    549     }
    550   }
    551   return true;
    552 }
    553 
    554 // <unqualified-name> ::= <operator-name>
    555 //                    ::= <ctor-dtor-name>
    556 //                    ::= <source-name>
    557 //                    ::= <local-source-name>
    558 static bool ParseUnqualifiedName(State *state) {
    559   return (ParseOperatorName(state) ||
    560           ParseCtorDtorName(state) ||
    561           ParseSourceName(state) ||
    562           ParseLocalSourceName(state));
    563 }
    564 
    565 // <source-name> ::= <positive length number> <identifier>
    566 static bool ParseSourceName(State *state) {
    567   State copy = *state;
    568   if (ParseNumber(state) && ParseIdentifier(state)) {
    569     return true;
    570   }
    571   *state = copy;
    572   return false;
    573 }
    574 
    575 // <local-source-name> ::= L <source-name> [<discriminator>]
    576 //
    577 // References:
    578 //   http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31775
    579 //   http://gcc.gnu.org/viewcvs?view=rev&revision=124467
    580 static bool ParseLocalSourceName(State *state) {
    581   State copy = *state;
    582   if (ParseChar(state, 'L') && ParseSourceName(state) &&
    583       Optional(ParseDiscriminator(state))) {
    584     return true;
    585   }
    586   *state = copy;
    587   return false;
    588 }
    589 
    590 // <number> ::= [n] <non-negative decimal integer>
    591 static bool ParseNumber(State *state) {
    592   int sign = 1;
    593   if (ParseChar(state, 'n')) {
    594     sign = -1;
    595   }
    596   const char *p = state->mangled_cur;
    597   int number = 0;
    598   for (;p < state->mangled_end; ++p) {
    599     if ((*p >= '0' && *p <= '9')) {
    600       number = number * 10 + (*p - '0');
    601     } else {
    602       break;
    603     }
    604   }
    605   if (p != state->mangled_cur) {  // Conversion succeeded.
    606     state->mangled_cur = p;
    607     state->number = number * sign;
    608     return true;
    609   }
    610   return false;
    611 }
    612 
    613 // Floating-point literals are encoded using a fixed-length lowercase
    614 // hexadecimal string.
    615 static bool ParseFloatNumber(State *state) {
    616   const char *p = state->mangled_cur;
    617   int number = 0;
    618   for (;p < state->mangled_end; ++p) {
    619     if ((*p >= '0' && *p <= '9')) {
    620       number = number * 16 + (*p - '0');
    621     } else if (*p >= 'a' && *p <= 'f') {
    622       number = number * 16 + (*p - 'a' + 10);
    623     } else {
    624       break;
    625     }
    626   }
    627   if (p != state->mangled_cur) {  // Conversion succeeded.
    628     state->mangled_cur = p;
    629     state->number = number;
    630     return true;
    631   }
    632   return false;
    633 }
    634 
    635 // The <seq-id> is a sequence number in base 36,
    636 // using digits and upper case letters
    637 static bool ParseSeqId(State *state) {
    638   const char *p = state->mangled_cur;
    639   int number = 0;
    640   for (;p < state->mangled_end; ++p) {
    641     if ((*p >= '0' && *p <= '9')) {
    642       number = number * 36 + (*p - '0');
    643     } else if (*p >= 'A' && *p <= 'Z') {
    644       number = number * 36 + (*p - 'A' + 10);
    645     } else {
    646       break;
    647     }
    648   }
    649   if (p != state->mangled_cur) {  // Conversion succeeded.
    650     state->mangled_cur = p;
    651     state->number = number;
    652     return true;
    653   }
    654   return false;
    655 }
    656 
    657 // <identifier> ::= <unqualified source code identifier>
    658 static bool ParseIdentifier(State *state) {
    659   if (state->number == -1 ||
    660       RemainingLength(state) < state->number) {
    661     return false;
    662   }
    663   if (IdentifierIsAnonymousNamespace(state)) {
    664     MaybeAppend(state, "(anonymous namespace)");
    665   } else {
    666     MaybeAppendWithLength(state, state->mangled_cur, state->number);
    667   }
    668   state->mangled_cur += state->number;
    669   state->number = -1;  // Reset the number.
    670   return true;
    671 }
    672 
    673 // <operator-name> ::= nw, and other two letters cases
    674 //                 ::= cv <type>  # (cast)
    675 //                 ::= v  <digit> <source-name> # vendor extended operator
    676 static bool ParseOperatorName(State *state) {
    677   if (RemainingLength(state) < 2) {
    678     return false;
    679   }
    680   // First check with "cv" (cast) case.
    681   State copy = *state;
    682   if (ParseTwoChar(state, "cv") &&
    683       MaybeAppend(state, "operator ") &&
    684       EnterNestedName(state) &&
    685       ParseType(state) &&
    686       LeaveNestedName(state, copy.nest_level)) {
    687     return true;
    688   }
    689   *state = copy;
    690 
    691   // Then vendor extended operators.
    692   if (ParseChar(state, 'v') && ParseCharClass(state, "0123456789") &&
    693       ParseSourceName(state)) {
    694     return true;
    695   }
    696   *state = copy;
    697 
    698   // Other operator names should start with a lower alphabet followed
    699   // by a lower/upper alphabet.
    700   if (!(IsLower(state->mangled_cur[0]) &&
    701         IsAlpha(state->mangled_cur[1]))) {
    702     return false;
    703   }
    704   // We may want to perform a binary search if we really need speed.
    705   const AbbrevPair *p;
    706   for (p = kOperatorList; p->abbrev != NULL; ++p) {
    707     if (state->mangled_cur[0] == p->abbrev[0] &&
    708         state->mangled_cur[1] == p->abbrev[1]) {
    709       MaybeAppend(state, "operator");
    710       if (IsLower(*p->real_name)) {  // new, delete, etc.
    711         MaybeAppend(state, " ");
    712       }
    713       MaybeAppend(state, p->real_name);
    714       state->mangled_cur += 2;
    715       return true;
    716     }
    717   }
    718   return false;
    719 }
    720 
    721 // <special-name> ::= TV <type>
    722 //                ::= TT <type>
    723 //                ::= TI <type>
    724 //                ::= TS <type>
    725 //                ::= Tc <call-offset> <call-offset> <(base) encoding>
    726 //                ::= GV <(object) name>
    727 //                ::= T <call-offset> <(base) encoding>
    728 // G++ extensions:
    729 //                ::= TC <type> <(offset) number> _ <(base) type>
    730 //                ::= TF <type>
    731 //                ::= TJ <type>
    732 //                ::= GR <name>
    733 //                ::= GA <encoding>
    734 //                ::= Th <call-offset> <(base) encoding>
    735 //                ::= Tv <call-offset> <(base) encoding>
    736 //
    737 // Note: we don't care much about them since they don't appear in
    738 // stack traces.  The are special data.
    739 static bool ParseSpecialName(State *state) {
    740   State copy = *state;
    741   if (ParseChar(state, 'T') &&
    742       ParseCharClass(state, "VTIS") &&
    743       ParseType(state)) {
    744     return true;
    745   }
    746   *state = copy;
    747 
    748   if (ParseTwoChar(state, "Tc") && ParseCallOffset(state) &&
    749       ParseCallOffset(state) && ParseEncoding(state)) {
    750     return true;
    751   }
    752   *state = copy;
    753 
    754   if (ParseTwoChar(state, "GV") &&
    755       ParseName(state)) {
    756     return true;
    757   }
    758   *state = copy;
    759 
    760   if (ParseChar(state, 'T') && ParseCallOffset(state) &&
    761       ParseEncoding(state)) {
    762     return true;
    763   }
    764   *state = copy;
    765 
    766   // G++ extensions
    767   if (ParseTwoChar(state, "TC") && ParseType(state) &&
    768       ParseNumber(state) && ParseChar(state, '_') &&
    769       DisableAppend(state) &&
    770       ParseType(state)) {
    771     RestoreAppend(state, copy.append);
    772     return true;
    773   }
    774   *state = copy;
    775 
    776   if (ParseChar(state, 'T') && ParseCharClass(state, "FJ") &&
    777       ParseType(state)) {
    778     return true;
    779   }
    780   *state = copy;
    781 
    782   if (ParseTwoChar(state, "GR") && ParseName(state)) {
    783     return true;
    784   }
    785   *state = copy;
    786 
    787   if (ParseTwoChar(state, "GA") && ParseEncoding(state)) {
    788     return true;
    789   }
    790   *state = copy;
    791 
    792   if (ParseChar(state, 'T') && ParseCharClass(state, "hv") &&
    793       ParseCallOffset(state) && ParseEncoding(state)) {
    794     return true;
    795   }
    796   *state = copy;
    797   return false;
    798 }
    799 
    800 // <call-offset> ::= h <nv-offset> _
    801 //               ::= v <v-offset> _
    802 static bool ParseCallOffset(State *state) {
    803   State copy = *state;
    804   if (ParseChar(state, 'h') &&
    805       ParseNVOffset(state) && ParseChar(state, '_')) {
    806     return true;
    807   }
    808   *state = copy;
    809 
    810   if (ParseChar(state, 'v') &&
    811       ParseVOffset(state) && ParseChar(state, '_')) {
    812     return true;
    813   }
    814   *state = copy;
    815 
    816   return false;
    817 }
    818 
    819 // <nv-offset> ::= <(offset) number>
    820 static bool ParseNVOffset(State *state) {
    821   return ParseNumber(state);
    822 }
    823 
    824 // <v-offset>  ::= <(offset) number> _ <(virtual offset) number>
    825 static bool ParseVOffset(State *state) {
    826   State copy = *state;
    827   if (ParseNumber(state) && ParseChar(state, '_') &&
    828       ParseNumber(state)) {
    829     return true;
    830   }
    831   *state = copy;
    832   return false;
    833 }
    834 
    835 // <ctor-dtor-name> ::= C1 | C2 | C3
    836 //                  ::= D0 | D1 | D2
    837 static bool ParseCtorDtorName(State *state) {
    838   State copy = *state;
    839   if (ParseChar(state, 'C') &&
    840       ParseCharClass(state, "123")) {
    841     const char * const prev_name = state->prev_name;
    842     const int prev_name_length = state->prev_name_length;
    843     MaybeAppendWithLength(state, prev_name, prev_name_length);
    844     return true;
    845   }
    846   *state = copy;
    847 
    848   if (ParseChar(state, 'D') &&
    849       ParseCharClass(state, "012")) {
    850     const char * const prev_name = state->prev_name;
    851     const int prev_name_length = state->prev_name_length;
    852     MaybeAppend(state, "~");
    853     MaybeAppendWithLength(state, prev_name, prev_name_length);
    854     return true;
    855   }
    856   *state = copy;
    857   return false;
    858 }
    859 
    860 // <type> ::= <CV-qualifiers> <type>
    861 //        ::= P <type>
    862 //        ::= R <type>
    863 //        ::= C <type>
    864 //        ::= G <type>
    865 //        ::= U <source-name> <type>
    866 //        ::= <builtin-type>
    867 //        ::= <function-type>
    868 //        ::= <class-enum-type>
    869 //        ::= <array-type>
    870 //        ::= <pointer-to-member-type>
    871 //        ::= <template-template-param> <template-args>
    872 //        ::= <template-param>
    873 //        ::= <substitution>
    874 static bool ParseType(State *state) {
    875   // We should check CV-qualifers, and PRGC things first.
    876   State copy = *state;
    877   if (ParseCVQualifiers(state) && ParseType(state)) {
    878     return true;
    879   }
    880   *state = copy;
    881 
    882   if (ParseCharClass(state, "PRCG") && ParseType(state)) {
    883     return true;
    884   }
    885   *state = copy;
    886 
    887   if (ParseChar(state, 'U') && ParseSourceName(state) &&
    888       ParseType(state)) {
    889     return true;
    890   }
    891   *state = copy;
    892 
    893   if (ParseBuiltinType(state) ||
    894       ParseFunctionType(state) ||
    895       ParseClassEnumType(state) ||
    896       ParseArrayType(state) ||
    897       ParsePointerToMemberType(state) ||
    898       ParseSubstitution(state)) {
    899     return true;
    900   }
    901 
    902   if (ParseTemplateTemplateParam(state) &&
    903       ParseTemplateArgs(state)) {
    904     return true;
    905   }
    906   *state = copy;
    907 
    908   // Less greedy than <template-template-param> <template-args>.
    909   if (ParseTemplateParam(state)) {
    910     return true;
    911   }
    912 
    913   return false;
    914 }
    915 
    916 // <CV-qualifiers> ::= [r] [V] [K]
    917 // We don't allow empty <CV-qualifiers> to avoid infinite loop in
    918 // ParseType().
    919 static bool ParseCVQualifiers(State *state) {
    920   int num_cv_qualifiers = 0;
    921   num_cv_qualifiers += ParseChar(state, 'r');
    922   num_cv_qualifiers += ParseChar(state, 'V');
    923   num_cv_qualifiers += ParseChar(state, 'K');
    924   return num_cv_qualifiers > 0;
    925 }
    926 
    927 // <builtin-type> ::= v, etc.
    928 //                ::= u <source-name>
    929 static bool ParseBuiltinType(State *state) {
    930   const AbbrevPair *p;
    931   for (p = kBuiltinTypeList; p->abbrev != NULL; ++p) {
    932     if (state->mangled_cur[0] == p->abbrev[0]) {
    933       MaybeAppend(state, p->real_name);
    934       ++state->mangled_cur;
    935       return true;
    936     }
    937   }
    938 
    939   State copy = *state;
    940   if (ParseChar(state, 'u') && ParseSourceName(state)) {
    941     return true;
    942   }
    943   *state = copy;
    944   return false;
    945 }
    946 
    947 // <function-type> ::= F [Y] <bare-function-type> E
    948 static bool ParseFunctionType(State *state) {
    949   State copy = *state;
    950   if (ParseChar(state, 'F') && Optional(ParseChar(state, 'Y')) &&
    951       ParseBareFunctionType(state) && ParseChar(state, 'E')) {
    952     return true;
    953   }
    954   *state = copy;
    955   return false;
    956 }
    957 
    958 // <bare-function-type> ::= <(signature) type>+
    959 static bool ParseBareFunctionType(State *state) {
    960   State copy = *state;
    961   DisableAppend(state);
    962   if (OneOrMore(ParseType, state)) {
    963     RestoreAppend(state, copy.append);
    964     MaybeAppend(state, "()");
    965     return true;
    966   }
    967   *state = copy;
    968   return false;
    969 }
    970 
    971 // <class-enum-type> ::= <name>
    972 static bool ParseClassEnumType(State *state) {
    973   return ParseName(state);
    974 }
    975 
    976 // <array-type> ::= A <(positive dimension) number> _ <(element) type>
    977 //              ::= A [<(dimension) expression>] _ <(element) type>
    978 static bool ParseArrayType(State *state) {
    979   State copy = *state;
    980   if (ParseChar(state, 'A') && ParseNumber(state) &&
    981       ParseChar(state, '_') && ParseType(state)) {
    982     return true;
    983   }
    984   *state = copy;
    985 
    986   if (ParseChar(state, 'A') && Optional(ParseExpression(state)) &&
    987       ParseChar(state, '_') && ParseType(state)) {
    988     return true;
    989   }
    990   *state = copy;
    991   return false;
    992 }
    993 
    994 // <pointer-to-member-type> ::= M <(class) type> <(member) type>
    995 static bool ParsePointerToMemberType(State *state) {
    996   State copy = *state;
    997   if (ParseChar(state, 'M') && ParseType(state) &&
    998       ParseType(state)) {
    999     return true;
   1000   }
   1001   *state = copy;
   1002   return false;
   1003 }
   1004 
   1005 // <template-param> ::= T_
   1006 //                  ::= T <parameter-2 non-negative number> _
   1007 static bool ParseTemplateParam(State *state) {
   1008   if (ParseTwoChar(state, "T_")) {
   1009     MaybeAppend(state, "?");  // We don't support template substitutions.
   1010     return true;
   1011   }
   1012 
   1013   State copy = *state;
   1014   if (ParseChar(state, 'T') && ParseNumber(state) &&
   1015       ParseChar(state, '_')) {
   1016     MaybeAppend(state, "?");  // We don't support template substitutions.
   1017     return true;
   1018   }
   1019   *state = copy;
   1020   return false;
   1021 }
   1022 
   1023 
   1024 // <template-template-param> ::= <template-param>
   1025 //                           ::= <substitution>
   1026 static bool ParseTemplateTemplateParam(State *state) {
   1027   return (ParseTemplateParam(state) ||
   1028           ParseSubstitution(state));
   1029 }
   1030 
   1031 // <template-args> ::= I <template-arg>+ E
   1032 static bool ParseTemplateArgs(State *state) {
   1033   State copy = *state;
   1034   DisableAppend(state);
   1035   if (ParseChar(state, 'I') &&
   1036       OneOrMore(ParseTemplateArg, state) &&
   1037       ParseChar(state, 'E')) {
   1038     RestoreAppend(state, copy.append);
   1039     MaybeAppend(state, "<>");
   1040     return true;
   1041   }
   1042   *state = copy;
   1043   return false;
   1044 }
   1045 
   1046 // <template-arg>  ::= <type>
   1047 //                 ::= <expr-primary>
   1048 //                 ::= X <expression> E
   1049 static bool ParseTemplateArg(State *state) {
   1050   if (ParseType(state) ||
   1051       ParseExprPrimary(state)) {
   1052     return true;
   1053   }
   1054 
   1055   State copy = *state;
   1056   if (ParseChar(state, 'X') && ParseExpression(state) &&
   1057       ParseChar(state, 'E')) {
   1058     return true;
   1059   }
   1060   *state = copy;
   1061   return false;
   1062 }
   1063 
   1064 // <expression> ::= <template-param>
   1065 //              ::= <expr-primary>
   1066 //              ::= <unary operator-name> <expression>
   1067 //              ::= <binary operator-name> <expression> <expression>
   1068 //              ::= <trinary operator-name> <expression> <expression>
   1069 //                  <expression>
   1070 //              ::= st <type>
   1071 //              ::= sr <type> <unqualified-name> <template-args>
   1072 //              ::= sr <type> <unqualified-name>
   1073 static bool ParseExpression(State *state) {
   1074   if (ParseTemplateParam(state) || ParseExprPrimary(state)) {
   1075     return true;
   1076   }
   1077 
   1078   State copy = *state;
   1079   if (ParseOperatorName(state) &&
   1080       ParseExpression(state) &&
   1081       ParseExpression(state) &&
   1082       ParseExpression(state)) {
   1083     return true;
   1084   }
   1085   *state = copy;
   1086 
   1087   if (ParseOperatorName(state) &&
   1088       ParseExpression(state) &&
   1089       ParseExpression(state)) {
   1090     return true;
   1091   }
   1092   *state = copy;
   1093 
   1094   if (ParseOperatorName(state) &&
   1095       ParseExpression(state)) {
   1096     return true;
   1097   }
   1098   *state = copy;
   1099 
   1100   if (ParseTwoChar(state, "st") && ParseType(state)) {
   1101     return true;
   1102   }
   1103   *state = copy;
   1104 
   1105   if (ParseTwoChar(state, "sr") && ParseType(state) &&
   1106       ParseUnqualifiedName(state) &&
   1107       ParseTemplateArgs(state)) {
   1108     return true;
   1109   }
   1110   *state = copy;
   1111 
   1112   if (ParseTwoChar(state, "sr") && ParseType(state) &&
   1113       ParseUnqualifiedName(state)) {
   1114     return true;
   1115   }
   1116   *state = copy;
   1117   return false;
   1118 }
   1119 
   1120 // <expr-primary> ::= L <type> <(value) number> E
   1121 //                ::= L <type> <(value) float> E
   1122 //                ::= L <mangled-name> E
   1123 //                // A bug in g++'s C++ ABI version 2 (-fabi-version=2).
   1124 //                ::= LZ <encoding> E
   1125 static bool ParseExprPrimary(State *state) {
   1126   State copy = *state;
   1127   if (ParseChar(state, 'L') && ParseType(state) &&
   1128       ParseNumber(state) &&
   1129       ParseChar(state, 'E')) {
   1130     return true;
   1131   }
   1132   *state = copy;
   1133 
   1134   if (ParseChar(state, 'L') && ParseType(state) &&
   1135       ParseFloatNumber(state) &&
   1136       ParseChar(state, 'E')) {
   1137     return true;
   1138   }
   1139   *state = copy;
   1140 
   1141   if (ParseChar(state, 'L') && ParseMangledName(state) &&
   1142       ParseChar(state, 'E')) {
   1143     return true;
   1144   }
   1145   *state = copy;
   1146 
   1147   if (ParseTwoChar(state, "LZ") && ParseEncoding(state) &&
   1148       ParseChar(state, 'E')) {
   1149     return true;
   1150   }
   1151   *state = copy;
   1152 
   1153   return false;
   1154 }
   1155 
   1156 // <local-name> := Z <(function) encoding> E <(entity) name>
   1157 //                 [<discriminator>]
   1158 //              := Z <(function) encoding> E s [<discriminator>]
   1159 static bool ParseLocalName(State *state) {
   1160   State copy = *state;
   1161   if (ParseChar(state, 'Z') && ParseEncoding(state) &&
   1162       ParseChar(state, 'E') && MaybeAppend(state, "::") &&
   1163       ParseName(state) && Optional(ParseDiscriminator(state))) {
   1164     return true;
   1165   }
   1166   *state = copy;
   1167 
   1168   if (ParseChar(state, 'Z') && ParseEncoding(state) &&
   1169       ParseTwoChar(state, "Es") && Optional(ParseDiscriminator(state))) {
   1170     return true;
   1171   }
   1172   *state = copy;
   1173   return false;
   1174 }
   1175 
   1176 // <discriminator> := _ <(non-negative) number>
   1177 static bool ParseDiscriminator(State *state) {
   1178   State copy = *state;
   1179   if (ParseChar(state, '_') && ParseNumber(state)) {
   1180     return true;
   1181   }
   1182   *state = copy;
   1183   return false;
   1184 }
   1185 
   1186 // <substitution> ::= S_
   1187 //                ::= S <seq-id> _
   1188 //                ::= St, etc.
   1189 static bool ParseSubstitution(State *state) {
   1190   if (ParseTwoChar(state, "S_")) {
   1191     MaybeAppend(state, "?");  // We don't support substitutions.
   1192     return true;
   1193   }
   1194 
   1195   State copy = *state;
   1196   if (ParseChar(state, 'S') && ParseSeqId(state) &&
   1197       ParseChar(state, '_')) {
   1198     MaybeAppend(state, "?");  // We don't support substitutions.
   1199     return true;
   1200   }
   1201   *state = copy;
   1202 
   1203   // Expand abbreviations like "St" => "std".
   1204   if (ParseChar(state, 'S')) {
   1205     const AbbrevPair *p;
   1206     for (p = kSubstitutionList; p->abbrev != NULL; ++p) {
   1207       if (state->mangled_cur[0] == p->abbrev[1]) {
   1208         MaybeAppend(state, "std");
   1209         if (p->real_name[0] != '\0') {
   1210           MaybeAppend(state, "::");
   1211           MaybeAppend(state, p->real_name);
   1212         }
   1213         state->mangled_cur += 1;
   1214         return true;
   1215       }
   1216     }
   1217   }
   1218   *state = copy;
   1219   return false;
   1220 }
   1221 
   1222 // The demangler entry point.
   1223 bool Demangle(const char *mangled, char *out, int out_size) {
   1224   State state;
   1225   InitState(&state, mangled, out, out_size);
   1226   return (ParseMangledName(&state) &&
   1227           state.overflowed == false &&
   1228           RemainingLength(&state) == 0);
   1229 }
   1230 
   1231 _END_GOOGLE_NAMESPACE_
   1232