[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