[llvm] 669bfcf - [Demangle] Add minimal support for D simple basic types

Luís Ferreira via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 12 14:01:48 PST 2022


Author: Luís Ferreira
Date: 2022-01-12T21:57:30Z
New Revision: 669bfcf036522930353010ba00de791827dbd33c

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

LOG: [Demangle] Add minimal support for D simple basic types

This patch implements simple demangling of two basic types to add minimal type functionality. This will be later used in function type parsing. After that being implemented we can add the rest of the types and test the result of the type name.

Reviewed By: dblaikie

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

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 0cefbd63a7ae5..93156f44d597b 100644
--- a/llvm/lib/Demangle/DLangDemangle.cpp
+++ b/llvm/lib/Demangle/DLangDemangle.cpp
@@ -115,6 +115,16 @@ struct Demangler {
   /// \see https://dlang.org/spec/abi.html#QualifiedName .
   const char *parseQualified(OutputBuffer *Demangled, const char *Mangled);
 
+  /// Extract and demangle a type from a given mangled symbol append it to
+  /// the output string.
+  ///
+  /// \param Mangled mangled symbol to be demangled.
+  ///
+  /// \return the remaining string on success or nullptr on failure.
+  ///
+  /// \see https://dlang.org/spec/abi.html#Type .
+  const char *parseType(const char *Mangled);
+
   /// The string we are demangling.
   const char *Str;
 };
@@ -174,8 +184,7 @@ const char *Demangler::parseMangle(OutputBuffer *Demangled,
     if (*Mangled == 'Z')
       ++Mangled;
     else {
-      // TODO: Implement symbols with types.
-      return nullptr;
+      Mangled = parseType(Mangled);
     }
   }
 
@@ -262,6 +271,31 @@ const char *Demangler::parseIdentifier(OutputBuffer *Demangled,
   return parseLName(Demangled, Mangled, Len);
 }
 
+const char *Demangler::parseType(const char *Mangled) {
+  if (*Mangled == '\0')
+    return nullptr;
+
+  switch (*Mangled) {
+  // TODO: Parse type qualifiers.
+  // TODO: Parse function types.
+  // TODO: Parse compound types.
+  // TODO: Parse delegate types.
+  // TODO: Parse tuple types.
+
+  // Basic types.
+  case 'i':
+    ++Mangled;
+    // TODO: Add type name dumping
+    return Mangled;
+
+    // TODO: Add support for the rest of the basic types.
+    // TODO: Parse back referenced types.
+
+  default: // unhandled.
+    return nullptr;
+  }
+}
+
 const char *Demangler::parseLName(OutputBuffer *Demangled, const char *Mangled,
                                   unsigned long Len) {
   switch (Len) {

diff  --git a/llvm/unittests/Demangle/DLangDemangleTest.cpp b/llvm/unittests/Demangle/DLangDemangleTest.cpp
index 3de47ab1c4e56..e5bd4c4602149 100644
--- a/llvm/unittests/Demangle/DLangDemangleTest.cpp
+++ b/llvm/unittests/Demangle/DLangDemangleTest.cpp
@@ -47,4 +47,9 @@ INSTANTIATE_TEST_SUITE_P(
         std::make_pair("_D8demangle4test12__ModuleInfoZ",
                        "ModuleInfo for demangle.test"),
         std::make_pair("_D8demangle4__S14testZ", "demangle.test"),
-        std::make_pair("_D8demangle4__Sd4testZ", "demangle.__Sd.test")));
+        std::make_pair("_D8demangle4__Sd4testZ", "demangle.__Sd.test"),
+        std::make_pair("_D8demangle3fooi", "demangle.foo"),
+        std::make_pair("_D8demangle3foo",
+                       nullptr), // symbol without a type sequence.
+        std::make_pair("_D8demangle3fooinvalidtypeseq",
+                       nullptr))); // invalid type sequence.


        


More information about the llvm-commits mailing list