[llvm] b779f02 - [Demangle] Add support for D anonymous symbols

David Blaikie via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 29 16:06:33 PST 2021


Author: Luís Ferreira
Date: 2021-11-29T16:05:48-08:00
New Revision: b779f02a1cb73bb3885e2059e418dfc1c16d25e2

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

LOG: [Demangle] Add support for D anonymous symbols

    Anonymous symbols are represented by 0 in the mangled symbol. We should skip
    them in order to represent the demangled name correctly, otherwise demangled
    names like `demangle..anon` can happen.

Reviewed By: dblaikie

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

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 a877174f95207..faf91b2394901 100644
--- a/llvm/lib/Demangle/DLangDemangle.cpp
+++ b/llvm/lib/Demangle/DLangDemangle.cpp
@@ -200,6 +200,15 @@ const char *Demangler::parseQualified(OutputBuffer *Demangled,
   // Whether it has more than one symbol
   size_t NotFirst = false;
   do {
+    // Skip over anonymous symbols.
+    if (*Mangled == '0') {
+      do
+        ++Mangled;
+      while (*Mangled == '0');
+
+      continue;
+    }
+
     if (NotFirst)
       *Demangled << '.';
     NotFirst = true;

diff  --git a/llvm/unittests/Demangle/DLangDemangleTest.cpp b/llvm/unittests/Demangle/DLangDemangleTest.cpp
index 750ce88424825..a3123601661ba 100644
--- a/llvm/unittests/Demangle/DLangDemangleTest.cpp
+++ b/llvm/unittests/Demangle/DLangDemangleTest.cpp
@@ -34,4 +34,6 @@ INSTANTIATE_TEST_SUITE_P(
         std::make_pair("_D88", nullptr),
         std::make_pair("_D8demangleZ", "demangle"),
         std::make_pair("_D8demangle4testZ", "demangle.test"),
-        std::make_pair("_D8demangle4test5test2Z", "demangle.test.test2")));
+        std::make_pair("_D8demangle4test5test2Z", "demangle.test.test2"),
+        std::make_pair("_D8demangle4test0Z", "demangle.test"),
+        std::make_pair("_D8demangle4test03fooZ", "demangle.test.foo")));


        


More information about the llvm-commits mailing list