Index: lib/Demangle/ItaniumDemangle.cpp =================================================================== --- lib/Demangle/ItaniumDemangle.cpp +++ lib/Demangle/ItaniumDemangle.cpp @@ -2688,9 +2688,34 @@ return first; } +// ::= [] +// ::= B + +template +static const char *parse_abitags(const char *first, const char *last, + C &db) { + const char *t; + while (last != first && first[0] == 'B') { + auto entry = db.names.back().move_full(); + db.names.pop_back(); + + t = parse_source_name(first + 1, last, db); + if (t != first + 1) { + db.names.back() = entry + "[abi:" + db.names.back().move_full() + "]"; + first = t; + } else { + // Should never get here for a correctly-mangled name, but if we do, + // leave as consistent a state as possible. + db.names.push_back(std::move(entry)); + return first; + } + } + return first; +} + // ::= // ::= -// ::= +// ::= [] // ::= template @@ -2720,8 +2745,10 @@ case '8': case '9': t = parse_source_name(first, last, db); - if (t != first) + if (t != first) { + t = parse_abitags(t, last, db); first = t; + } break; default: t = parse_operator_name(first, last, db);