aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Demangle/RustDemangle.cpp
diff options
context:
space:
mode:
authorTomasz Miąsko <tomasz.miasko@gmail.com>2021-05-09 13:38:13 -0700
committerDavid Blaikie <dblaikie@gmail.com>2021-05-09 15:45:57 -0700
commit78e949159d105b7947dbae973080ea343e8f9eda (patch)
treeaad7d2e9ec318c5db8ed1db619c0d5b0f2e47d4e /llvm/lib/Demangle/RustDemangle.cpp
parentbe23d5e81439e701c67c767b06fe4c7afcde6af9 (diff)
downloadllvm-78e949159d105b7947dbae973080ea343e8f9eda.zip
llvm-78e949159d105b7947dbae973080ea343e8f9eda.tar.gz
llvm-78e949159d105b7947dbae973080ea343e8f9eda.tar.bz2
[Demangle][Rust] Print special namespaces
Reviewed By: dblaikie Differential Revision: https://reviews.llvm.org/D101821
Diffstat (limited to 'llvm/lib/Demangle/RustDemangle.cpp')
-rw-r--r--llvm/lib/Demangle/RustDemangle.cpp49
1 files changed, 34 insertions, 15 deletions
diff --git a/llvm/lib/Demangle/RustDemangle.cpp b/llvm/lib/Demangle/RustDemangle.cpp
index d196d66..213bf28 100644
--- a/llvm/lib/Demangle/RustDemangle.cpp
+++ b/llvm/lib/Demangle/RustDemangle.cpp
@@ -132,7 +132,7 @@ void Demangler::demanglePath() {
Error = true;
return;
}
- RecursionLevel += 1;
+ SwapAndRestore<size_t> SaveRecursionLevel(RecursionLevel, RecursionLevel + 1);
switch (consume()) {
case 'C': {
@@ -149,15 +149,31 @@ void Demangler::demanglePath() {
}
demanglePath();
- parseOptionalBase62Number('s');
+ uint64_t Disambiguator = parseOptionalBase62Number('s');
Identifier Ident = parseIdentifier();
- if (!Ident.empty()) {
- // FIXME print special namespaces:
- // * "C" closures
- // * "S" shim
- print("::");
- print(Ident.Name);
+ if (isUpper(NS)) {
+ // Special namespaces
+ print("::{");
+ if (NS == 'C')
+ print("closure");
+ else if (NS == 'S')
+ print("shim");
+ else
+ print(NS);
+ if (!Ident.empty()) {
+ print(":");
+ print(Ident.Name);
+ }
+ print('#');
+ printDecimalNumber(Disambiguator);
+ print('}');
+ } else {
+ // Implementation internal namespaces.
+ if (!Ident.empty()) {
+ print("::");
+ print(Ident.Name);
+ }
}
break;
}
@@ -166,8 +182,6 @@ void Demangler::demanglePath() {
Error = true;
break;
}
-
- RecursionLevel -= 1;
}
// <undisambiguated-identifier> = ["u"] <decimal-number> ["_"] <bytes>
@@ -195,11 +209,16 @@ Identifier Demangler::parseIdentifier() {
}
// Parses optional base 62 number. The presence of a number is determined using
-// Tag.
-void Demangler::parseOptionalBase62Number(char Tag) {
- // Parsing result is currently unused.
- if (consumeIf(Tag))
- parseBase62Number();
+// Tag. Returns 0 when tag is absent and parsed value + 1 otherwise.
+uint64_t Demangler::parseOptionalBase62Number(char Tag) {
+ if (!consumeIf(Tag))
+ return 0;
+
+ uint64_t N = parseBase62Number();
+ if (Error || !addAssign(N, 1))
+ return 0;
+
+ return N;
}
// Parses base 62 number with <0-9a-zA-Z> as digits. Number is terminated by