[PATCH] D114305: [Demangle] Add support for multiple identifiers in D qualified names

Luís Ferreira via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Nov 19 19:10:09 PST 2021


ljmf00 created this revision.
ljmf00 added a project: LLVM.
Herald added a subscriber: hiraditya.
ljmf00 requested review of this revision.
Herald added a subscriber: llvm-commits.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D114305

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


Index: llvm/unittests/Demangle/DLangDemangleTest.cpp
===================================================================
--- llvm/unittests/Demangle/DLangDemangleTest.cpp
+++ llvm/unittests/Demangle/DLangDemangleTest.cpp
@@ -26,11 +26,12 @@
   EXPECT_STREQ(Demangled, GetParam().second);
 }
 
-INSTANTIATE_TEST_SUITE_P(DLangDemangleTest, DLangDemangleTestFixture,
-                         testing::Values(std::make_pair("_Dmain", "D main"),
-                                         std::make_pair(nullptr, nullptr),
-                                         std::make_pair("_Z", nullptr),
-                                         std::make_pair("_DDD", nullptr),
-                                         std::make_pair("_D88", nullptr),
-                                         std::make_pair("_D8demangleZ",
-                                                        "demangle")));
+INSTANTIATE_TEST_SUITE_P(
+    DLangDemangleTest, DLangDemangleTestFixture,
+    testing::Values(
+        std::make_pair("_Dmain", "D main"), std::make_pair(nullptr, nullptr),
+        std::make_pair("_Z", nullptr), std::make_pair("_DDD", nullptr),
+        std::make_pair("_D88", nullptr),
+        std::make_pair("_D8demangleZ", "demangle"),
+        std::make_pair("_D8demangle4testZ", "demangle.test"),
+        std::make_pair("_D8demangle4test5test2Z", "demangle.test.test2")));
Index: llvm/lib/Demangle/DLangDemangle.cpp
===================================================================
--- llvm/lib/Demangle/DLangDemangle.cpp
+++ llvm/lib/Demangle/DLangDemangle.cpp
@@ -69,6 +69,15 @@
   /// \see https://dlang.org/spec/abi.html#Number .
   const char *decodeNumber(const char *Mangled, unsigned long *Ret);
 
+  /// Check whether it is the beginning of a symbol name.
+  ///
+  /// \param Mangled string to extract the symbol name.
+  ///
+  /// \return true on success, false otherwise.
+  ///
+  /// \see https://dlang.org/spec/abi.html#SymbolName .
+  bool isSymbolName(const char *Mangled);
+
   /// Extract and demangle an identifier from a given mangled symbol append it
   /// to the output string.
   ///
@@ -136,6 +145,14 @@
   return Mangled;
 }
 
+bool Demangler::isSymbolName(const char *Mangled) {
+  if (std::isdigit(*Mangled))
+    return true;
+
+  // TODO: Handle symbol back references and template instances.
+  return false;
+}
+
 const char *Demangler::parseMangle(OutputBuffer *Demangled,
                                    const char *Mangled) {
   // A D mangled symbol is comprised of both scope and type information.
@@ -180,9 +197,16 @@
   //        SymbolName M TypeModifiers TypeFunctionNoReturn
   // The start pointer should be at the above location.
 
-  // TODO: Parse multiple identifiers
+  size_t N = 0;
+  do {
+    if (N++)
+      *Demangled << '.';
+
+    Mangled = parseIdentifier(Demangled, Mangled);
+
+  } while (Mangled && isSymbolName(Mangled));
 
-  return parseIdentifier(Demangled, Mangled);
+  return Mangled;
 }
 
 const char *Demangler::parseIdentifier(OutputBuffer *Demangled,


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D114305.388676.patch
Type: text/x-patch
Size: 3028 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211120/097500d1/attachment.bin>


More information about the llvm-commits mailing list