OSDN Git Service

llvm-undname: Several behavior-preserving changes to increase coverage
authorNico Weber <nicolasweber@gmx.de>
Tue, 4 Jun 2019 15:13:30 +0000 (15:13 +0000)
committerNico Weber <nicolasweber@gmx.de>
Tue, 4 Jun 2019 15:13:30 +0000 (15:13 +0000)
- 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
lib/Demangle/MicrosoftDemangleNodes.cpp
test/Demangle/invalid-manglings.test
test/Demangle/ms-basic.test

index b93a84e..83e6f60 100644 (file)
@@ -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       <name>
       // H - multiple inheritance     <name> <number>
-      // I - virtual inheritance      <name> <number> <number> <number>
+      // I - virtual inheritance      <name> <number> <number>
       // J - unspecified inheritance  <name> <number> <number> <number>
       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;
 
index c26151c..c07fde8 100644 (file)
@@ -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,
index 8490c02..8d84034 100644 (file)
 ; 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
index b80d87c..844602b 100644 (file)
@@ -11,6 +11,9 @@
 ?x@@3PEAPEAHEA
 ; CHECK: int **x
 
+?foo@@3Y123KA
+; CHECK: unsigned long foo[3][4]
+
 ?x@@3PEAY02HEA
 ; CHECK: int (*x)[3]