[llvm] 0683329 - [Demangle][Rust] Parse named types

Tomasz Miąsko via llvm-commits llvm-commits at lists.llvm.org
Tue May 18 15:12:26 PDT 2021


Author: Tomasz Miąsko
Date: 2021-05-19T00:04:41+02:00
New Revision: 068332978c672afb7504b2d2856d0df9010f27bf

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

LOG: [Demangle][Rust] Parse named types

Reviewed By: dblaikie

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

Added: 
    

Modified: 
    llvm/include/llvm/Demangle/RustDemangle.h
    llvm/lib/Demangle/RustDemangle.cpp
    llvm/test/Demangle/rust.test

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/Demangle/RustDemangle.h b/llvm/include/llvm/Demangle/RustDemangle.h
index 7d575fbd6e29..86641f2bea42 100644
--- a/llvm/include/llvm/Demangle/RustDemangle.h
+++ b/llvm/include/llvm/Demangle/RustDemangle.h
@@ -52,6 +52,11 @@ enum class BasicType {
   Never,
 };
 
+enum class InType {
+  No,
+  Yes,
+};
+
 class Demangler {
   // Maximum recursion level. Used to avoid stack overflow.
   size_t MaxRecursionLevel;
@@ -79,8 +84,8 @@ class Demangler {
   bool demangle(StringView MangledName);
 
 private:
-  void demanglePath();
-  void demangleImplPath();
+  void demanglePath(InType InType);
+  void demangleImplPath(InType InType);
   void demangleGenericArg();
   void demangleType();
   void demangleConst();

diff  --git a/llvm/lib/Demangle/RustDemangle.cpp b/llvm/lib/Demangle/RustDemangle.cpp
index 70183ee67ba3..6e2694f46c55 100644
--- a/llvm/lib/Demangle/RustDemangle.cpp
+++ b/llvm/lib/Demangle/RustDemangle.cpp
@@ -110,7 +110,7 @@ bool Demangler::demangle(StringView Mangled) {
   }
   Input = Mangled;
 
-  demanglePath();
+  demanglePath(InType::No);
 
   // FIXME parse optional <instantiating-crate>.
 
@@ -120,6 +120,8 @@ bool Demangler::demangle(StringView Mangled) {
   return !Error;
 }
 
+// Demangles a path. InType indicates whether a path is inside a type.
+//
 // <path> = "C" <identifier>               // crate root
 //        | "M" <impl-path> <type>         // <T> (inherent impl)
 //        | "X" <impl-path> <type> <path>  // <T as Trait> (trait impl)
@@ -132,7 +134,7 @@ bool Demangler::demangle(StringView Mangled) {
 //      | "S"      // shim
 //      | <A-Z>    // other special namespaces
 //      | <a-z>    // internal namespaces
-void Demangler::demanglePath() {
+void Demangler::demanglePath(InType InType) {
   if (Error || RecursionLevel >= MaxRecursionLevel) {
     Error = true;
     return;
@@ -147,18 +149,18 @@ void Demangler::demanglePath() {
     break;
   }
   case 'M': {
-    demangleImplPath();
+    demangleImplPath(InType);
     print("<");
     demangleType();
     print(">");
     break;
   }
   case 'X': {
-    demangleImplPath();
+    demangleImplPath(InType);
     print("<");
     demangleType();
     print(" as ");
-    demanglePath();
+    demanglePath(InType::Yes);
     print(">");
     break;
   }
@@ -166,7 +168,7 @@ void Demangler::demanglePath() {
     print("<");
     demangleType();
     print(" as ");
-    demanglePath();
+    demanglePath(InType::Yes);
     print(">");
     break;
   }
@@ -176,7 +178,7 @@ void Demangler::demanglePath() {
       Error = true;
       break;
     }
-    demanglePath();
+    demanglePath(InType);
 
     uint64_t Disambiguator = parseOptionalBase62Number('s');
     Identifier Ident = parseIdentifier();
@@ -207,8 +209,11 @@ void Demangler::demanglePath() {
     break;
   }
   case 'I': {
-    demanglePath();
-    print("::<");
+    demanglePath(InType);
+    // Omit "::" when in a type, where it is optional.
+    if (InType == InType::No)
+      print("::");
+    print("<");
     for (size_t I = 0; !Error && !consumeIf('E'); ++I) {
       if (I > 0)
         print(", ");
@@ -226,10 +231,10 @@ void Demangler::demanglePath() {
 
 // <impl-path> = [<disambiguator>] <path>
 // <disambiguator> = "s" <base-62-number>
-void Demangler::demangleImplPath() {
+void Demangler::demangleImplPath(InType InType) {
   SwapAndRestore<bool> SavePrint(Print, false);
   parseOptionalBase62Number('s');
-  demanglePath();
+  demanglePath(InType);
 }
 
 // <generic-arg> = <lifetime>
@@ -416,11 +421,14 @@ void Demangler::printBasicType(BasicType Type) {
 //          | "D" <dyn-bounds> <lifetime> // dyn Trait<Assoc = X> + Send + 'a
 //          | <backref>                   // backref
 void Demangler::demangleType() {
+  char C = look();
   BasicType Type;
-  if (parseBasicType(consume(), Type))
-    printBasicType(Type);
-  else
-    Error = true; // FIXME parse remaining productions.
+  if (parseBasicType(C, Type)) {
+    consume();
+    return printBasicType(Type);
+  }
+
+  demanglePath(InType::Yes);
 }
 
 // <const> = <basic-type> <const-data>

diff  --git a/llvm/test/Demangle/rust.test b/llvm/test/Demangle/rust.test
index f3e23844a115..99beacc54b01 100644
--- a/llvm/test/Demangle/rust.test
+++ b/llvm/test/Demangle/rust.test
@@ -135,6 +135,26 @@ CHECK: basic::<u64>
 CHECK: basic::<!>
        _RIC5basiczE
 
+; Named types. Test possible paths productions.
+
+CHECK: named::<name>
+       _RIC5namedC4nameE
+
+CHECK: named::<<_>>
+       _RIC5namedMC5cratepE
+
+CHECK: named::<<_ as Name>>
+       _RIC5namedXC5cratepC4NameE
+
+CHECK: named::<<_ as Name>>
+       _RIC5namedYpC4NameE
+
+CHECK: named::<name::Name>
+       _RIC5namedNvC4name4NameE
+
+CHECK: named::<Name<>>
+       _RIC5namedIC4NameEE
+
 ; Integer constants. Test value demangling.
 
 CHECK: integer::<0>


        


More information about the llvm-commits mailing list