From a94891b42dce7a570d729472cbea19fd1ef201c2 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Tue, 4 Jun 2019 15:13:30 +0000 Subject: [PATCH] llvm-undname: Several behavior-preserving changes to increase coverage - Replace `Error = true` in a few branches that are truly unreachable with DEMANGLE_UNREACHABLE - Remove early return early in startsWithLocalScopePattern() because it's redundant with the next two early returns - Remove unreachable `case '0'` (it's handled in the branch below) - Remove an unused bool return - Add test coverage for several early error returns, mostly in array type parsing git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@362506 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Demangle/MicrosoftDemangle.cpp | 17 ++++++----------- lib/Demangle/MicrosoftDemangleNodes.cpp | 9 ++++----- test/Demangle/invalid-manglings.test | 25 +++++++++++++++++++++++++ test/Demangle/ms-basic.test | 3 +++ 4 files changed, 38 insertions(+), 16 deletions(-) diff --git a/lib/Demangle/MicrosoftDemangle.cpp b/lib/Demangle/MicrosoftDemangle.cpp index b93a84ea91d..83e6f60de03 100644 --- a/lib/Demangle/MicrosoftDemangle.cpp +++ b/lib/Demangle/MicrosoftDemangle.cpp @@ -58,8 +58,9 @@ static bool isMemberPointer(StringView MangledName, bool &Error) { // what. break; default: - Error = true; - return false; + // isMemberPointer() is called only if isPointerType() returns true, + // and it rejects other prefixes. + DEMANGLE_UNREACHABLE; } // If it starts with a number, then 6 indicates a non-member function @@ -141,8 +142,6 @@ consumeSpecialIntrinsicKind(StringView &MangledName) { static bool startsWithLocalScopePattern(StringView S) { if (!S.consumeFront('?')) return false; - if (S.size() < 2) - return false; size_t End = S.find('?'); if (End == StringView::npos) @@ -2197,7 +2196,7 @@ Demangler::demangleTemplateParameterList(StringView &MangledName) { MangledName = MangledName.dropFront(); // 1 - single inheritance // H - multiple inheritance - // I - virtual inheritance + // I - virtual inheritance // J - unspecified inheritance char InheritanceSpecifier = MangledName.popFront(); SymbolNode *S = nullptr; @@ -2226,8 +2225,7 @@ Demangler::demangleTemplateParameterList(StringView &MangledName) { case '1': break; default: - Error = true; - break; + DEMANGLE_UNREACHABLE; } TPRN->Affinity = PointerAffinity::Pointer; TPRN->Symbol = S; @@ -2254,12 +2252,9 @@ Demangler::demangleTemplateParameterList(StringView &MangledName) { demangleSigned(MangledName); TPRN->ThunkOffsets[TPRN->ThunkOffsetCount++] = demangleSigned(MangledName); - DEMANGLE_FALLTHROUGH; - case '0': break; default: - Error = true; - break; + DEMANGLE_UNREACHABLE; } TPRN->IsMemberPointer = true; diff --git a/lib/Demangle/MicrosoftDemangleNodes.cpp b/lib/Demangle/MicrosoftDemangleNodes.cpp index c26151c5b19..c07fde897e0 100644 --- a/lib/Demangle/MicrosoftDemangleNodes.cpp +++ b/lib/Demangle/MicrosoftDemangleNodes.cpp @@ -34,21 +34,20 @@ static void outputSpaceIfNecessary(OutputStream &OS) { OS << " "; } -static bool outputSingleQualifier(OutputStream &OS, Qualifiers Q) { +static void outputSingleQualifier(OutputStream &OS, Qualifiers Q) { switch (Q) { case Q_Const: OS << "const"; - return true; + break; case Q_Volatile: OS << "volatile"; - return true; + break; case Q_Restrict: OS << "__restrict"; - return true; + break; default: break; } - return false; } static bool outputQualifierIfPresent(OutputStream &OS, Qualifiers Q, diff --git a/test/Demangle/invalid-manglings.test b/test/Demangle/invalid-manglings.test index 8490c02501f..8d84034452c 100644 --- a/test/Demangle/invalid-manglings.test +++ b/test/Demangle/invalid-manglings.test @@ -220,7 +220,32 @@ ; CHECK-NEXT: ??_C@_0101234567@?$az ; CHECK-NEXT: error: Invalid mangled name +??_C@_1201234567@a?$az +; CHECK-EMPTY: +; CHECK-NEXT: ??_C@_1201234567@a?$az +; CHECK-NEXT: error: Invalid mangled name + ??@foo ; CHECK-EMPTY: ; CHECK-NEXT: ??@foo ; CHECK-NEXT: error: Invalid mangled name + +?foo@@3YA@A +; CHECK-EMPTY: +; CHECK-NEXT: ?foo@@3YA@A +; CHECK-NEXT: error: Invalid mangled name + +?foo@@3Y~01KA +; CHECK-EMPTY: +; CHECK-NEXT: ?foo@@3Y~01KA +; CHECK-NEXT: error: Invalid mangled name + +?foo@@3Y0~1KA +; CHECK-EMPTY: +; CHECK-NEXT: ?foo@@3Y0~1KA +; CHECK-NEXT: error: Invalid mangled name + +?x@@3PEAY02$$CRHEA +; CHECK-EMPTY: +; CHECK-NEXT: ?x@@3PEAY02$$CRHEA +; CHECK-NEXT: error: Invalid mangled name diff --git a/test/Demangle/ms-basic.test b/test/Demangle/ms-basic.test index b80d87c6455..844602bfe4b 100644 --- a/test/Demangle/ms-basic.test +++ b/test/Demangle/ms-basic.test @@ -11,6 +11,9 @@ ?x@@3PEAPEAHEA ; CHECK: int **x +?foo@@3Y123KA +; CHECK: unsigned long foo[3][4] + ?x@@3PEAY02HEA ; CHECK: int (*x)[3] -- 2.40.0