From: Nico Weber Date: Wed, 3 Apr 2019 23:14:33 +0000 (+0000) Subject: llvm-cxxfilt: Demangle gcc "old-style unified" ctors and dtors X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2ca31392986addf2569b5aa833a958ddcd9b8e8e;p=llvm llvm-cxxfilt: Demangle gcc "old-style unified" ctors and dtors These are variant 4, cf https://github.com/gcc-mirror/gcc/blob/master/gcc/cp/mangle.c#L1851 https://github.com/gcc-mirror/gcc/blob/master/gcc/cp/mangle.c#L1880 and gcc seems to sometimes emit them still. Differential Revision: https://reviews.llvm.org/D60229 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@357645 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Demangle/ItaniumDemangle.h b/include/llvm/Demangle/ItaniumDemangle.h index df06aa62d33..4dca309e3cb 100644 --- a/include/llvm/Demangle/ItaniumDemangle.h +++ b/include/llvm/Demangle/ItaniumDemangle.h @@ -2794,11 +2794,13 @@ AbstractManglingParser::parseOperatorName(NameState *State) { // ::= C1 # complete object constructor // ::= C2 # base object constructor // ::= C3 # complete object allocating constructor -// extension ::= C5 # ? +// extension ::= C4 # gcc old-style "[unified]" constructor +// extension ::= C5 # the COMDAT used for ctors // ::= D0 # deleting destructor // ::= D1 # complete object destructor // ::= D2 # base object destructor -// extension ::= D5 # ? +// extension ::= D4 # gcc old-style "[unified]" destructor +// extension ::= D5 # the COMDAT used for dtors template Node * AbstractManglingParser::parseCtorDtorName(Node *&SoFar, @@ -2821,7 +2823,8 @@ AbstractManglingParser::parseCtorDtorName(Node *&SoFar, if (consumeIf('C')) { bool IsInherited = consumeIf('I'); - if (look() != '1' && look() != '2' && look() != '3' && look() != '5') + if (look() != '1' && look() != '2' && look() != '3' && look() != '4' && + look() != '5') return nullptr; int Variant = look() - '0'; ++First; @@ -2830,15 +2833,15 @@ AbstractManglingParser::parseCtorDtorName(Node *&SoFar, if (getDerived().parseName(State) == nullptr) return nullptr; } - return make(SoFar, false, Variant); + return make(SoFar, /*IsDtor=*/false, Variant); } - if (look() == 'D' && - (look(1) == '0' || look(1) == '1' || look(1) == '2' || look(1) == '5')) { + if (look() == 'D' && (look(1) == '0' || look(1) == '1' || look(1) == '2' || + look(1) == '4' || look(1) == '5')) { int Variant = look(1) - '0'; First += 2; if (State) State->CtorDtorConversion = true; - return make(SoFar, true, Variant); + return make(SoFar, /*IsDtor=*/true, Variant); } return nullptr;