[llvm] r339891 - [MS Demangler] Don't fail on MD5-mangled names.

Zachary Turner via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 16 09:17:17 PDT 2018


Author: zturner
Date: Thu Aug 16 09:17:17 2018
New Revision: 339891

URL: http://llvm.org/viewvc/llvm-project?rev=339891&view=rev
Log:
[MS Demangler] Don't fail on MD5-mangled names.

When we have an MD5 mangled name, we shouldn't choke and say
that it's an invalid name.  Even though it's impossible to demangle,
we should just output the original name.

Added:
    llvm/trunk/test/Demangle/ms-md5.test
Modified:
    llvm/trunk/lib/Demangle/MicrosoftDemangle.cpp

Modified: llvm/trunk/lib/Demangle/MicrosoftDemangle.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Demangle/MicrosoftDemangle.cpp?rev=339891&r1=339890&r2=339891&view=diff
==============================================================================
--- llvm/trunk/lib/Demangle/MicrosoftDemangle.cpp (original)
+++ llvm/trunk/lib/Demangle/MicrosoftDemangle.cpp Thu Aug 16 09:17:17 2018
@@ -213,7 +213,7 @@ enum NameBackrefBehavior : uint8_t {
   NBB_Simple = 1 << 1,   // save simple names.
 };
 
-enum class SymbolCategory { Function, Variable };
+enum class SymbolCategory { Function, Variable, Unknown };
 
 namespace {
 
@@ -1051,6 +1051,15 @@ StringView Demangler::copyString(StringV
 Symbol *Demangler::parse(StringView &MangledName) {
   Symbol *S = Arena.alloc<Symbol>();
 
+  // We can't demangle MD5 names, just output them as-is.
+  if (MangledName.startsWith("??@")) {
+    S->Category = SymbolCategory::Unknown;
+    S->SymbolName = Arena.alloc<Name>();
+    S->SymbolName->Str = MangledName;
+    MangledName = StringView();
+    return S;
+  }
+
   // MSVC-style mangled symbols must start with '?'.
   if (!MangledName.consumeFront("?")) {
     S->SymbolName = Arena.alloc<Name>();
@@ -2180,6 +2189,10 @@ StringView Demangler::resolve(StringView
 }
 
 void Demangler::output(const Symbol *S, OutputStream &OS) {
+  if (S->Category == SymbolCategory::Unknown) {
+    outputName(OS, S->SymbolName, S->SymbolType, *this);
+    return;
+  }
   // Converts an AST to a string.
   //
   // Converting an AST representing a C++ type to a string is tricky due

Added: llvm/trunk/test/Demangle/ms-md5.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Demangle/ms-md5.test?rev=339891&view=auto
==============================================================================
--- llvm/trunk/test/Demangle/ms-md5.test (added)
+++ llvm/trunk/test/Demangle/ms-md5.test Thu Aug 16 09:17:17 2018
@@ -0,0 +1,11 @@
+; These tests are based on clang/test/CodeGenCXX/mangle-ms-cxx11.cpp
+
+; RUN: llvm-undname < %s | FileCheck %s
+
+; CHECK-NOT: Invalid mangled name
+
+; MD5-mangled names start with ??@ and we should output them as is.  We have
+; two check lines here since the tool echos the input.
+??@a6a285da2eea70dba6b578022be61d81@
+; CHECK: ??@a6a285da2eea70dba6b578022be61d81@
+; CHECK-NEXT: ??@a6a285da2eea70dba6b578022be61d81@
\ No newline at end of file




More information about the llvm-commits mailing list