[llvm] 83087c0 - [Demangle] Add support for D function-local parent symbols

Luís Ferreira via llvm-commits llvm-commits at lists.llvm.org
Mon Dec 6 17:48:43 PST 2021


Author: Luís Ferreira
Date: 2021-12-07T01:46:13Z
New Revision: 83087c096af9e8ca63362714cf82d5c477c00e73

URL: https://github.com/llvm/llvm-project/commit/83087c096af9e8ca63362714cf82d5c477c00e73
DIFF: https://github.com/llvm/llvm-project/commit/83087c096af9e8ca63362714cf82d5c477c00e73.diff

LOG: [Demangle] Add support for D function-local parent symbols

    Internally `__Sddd` function-local parent symbols are used to solve ambiguities on symbols in
    the same scope with the same mangled name.

Reviewed By: dblaikie

Differential Revision: https://reviews.llvm.org/D114309

Added: 
    

Modified: 
    llvm/lib/Demangle/DLangDemangle.cpp
    llvm/unittests/Demangle/DLangDemangleTest.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Demangle/DLangDemangle.cpp b/llvm/lib/Demangle/DLangDemangle.cpp
index 86f7412067d6..0cefbd63a7ae 100644
--- a/llvm/lib/Demangle/DLangDemangle.cpp
+++ b/llvm/lib/Demangle/DLangDemangle.cpp
@@ -242,6 +242,23 @@ const char *Demangler::parseIdentifier(OutputBuffer *Demangled,
 
   // TODO: Parse template instances with a length prefix.
 
+  // There can be multiple 
diff erent declarations in the same function that
+  // have the same mangled name.  To make the mangled names unique, a fake
+  // parent in the form `__Sddd' is added to the symbol.
+  if (Len >= 4 && Mangled[0] == '_' && Mangled[1] == '_' && Mangled[2] == 'S') {
+    const char *NumPtr = Mangled + 3;
+    while (NumPtr < (Mangled + Len) && std::isdigit(*NumPtr))
+      ++NumPtr;
+
+    if (Mangled + Len == NumPtr) {
+      // Skip over the fake parent.
+      Mangled += Len;
+      return parseIdentifier(Demangled, Mangled);
+    }
+
+    // Else demangle it as a plain identifier.
+  }
+
   return parseLName(Demangled, Mangled, Len);
 }
 

diff  --git a/llvm/unittests/Demangle/DLangDemangleTest.cpp b/llvm/unittests/Demangle/DLangDemangleTest.cpp
index e1904d4435c1..3de47ab1c4e5 100644
--- a/llvm/unittests/Demangle/DLangDemangleTest.cpp
+++ b/llvm/unittests/Demangle/DLangDemangleTest.cpp
@@ -45,4 +45,6 @@ INSTANTIATE_TEST_SUITE_P(
         std::make_pair("_D8demangle4test11__InterfaceZ",
                        "Interface for demangle.test"),
         std::make_pair("_D8demangle4test12__ModuleInfoZ",
-                       "ModuleInfo for demangle.test")));
+                       "ModuleInfo for demangle.test"),
+        std::make_pair("_D8demangle4__S14testZ", "demangle.test"),
+        std::make_pair("_D8demangle4__Sd4testZ", "demangle.__Sd.test")));


        


More information about the llvm-commits mailing list