aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Demangle/RustDemangle.cpp
diff options
context:
space:
mode:
authorTomasz Miąsko <tomasz.miasko@gmail.com>2021-06-07 23:35:50 +0200
committerTomasz Miąsko <tomasz.miasko@gmail.com>2021-06-08 10:01:50 +0200
commitf9a79356f223035ccf0b4d0666f8779061eddc61 (patch)
treef1c1bf2deb18c43c0aaaae2857161f1420b12b88 /llvm/lib/Demangle/RustDemangle.cpp
parent44d63c57c129f6c784460070c30cb736dbbdb927 (diff)
downloadllvm-f9a79356f223035ccf0b4d0666f8779061eddc61.zip
llvm-f9a79356f223035ccf0b4d0666f8779061eddc61.tar.gz
llvm-f9a79356f223035ccf0b4d0666f8779061eddc61.tar.bz2
[Demangle][Rust] Parse const backreferences
Reviewed By: dblaikie Differential Revision: https://reviews.llvm.org/D103848
Diffstat (limited to 'llvm/lib/Demangle/RustDemangle.cpp')
-rw-r--r--llvm/lib/Demangle/RustDemangle.cpp12
1 files changed, 10 insertions, 2 deletions
diff --git a/llvm/lib/Demangle/RustDemangle.cpp b/llvm/lib/Demangle/RustDemangle.cpp
index 4a8f35b..919a668 100644
--- a/llvm/lib/Demangle/RustDemangle.cpp
+++ b/llvm/lib/Demangle/RustDemangle.cpp
@@ -625,8 +625,15 @@ void Demangler::demangleOptionalBinder() {
// | "p" // placeholder
// | <backref>
void Demangler::demangleConst() {
+ if (Error || RecursionLevel >= MaxRecursionLevel) {
+ Error = true;
+ return;
+ }
+ SwapAndRestore<size_t> SaveRecursionLevel(RecursionLevel, RecursionLevel + 1);
+
+ char C = consume();
BasicType Type;
- if (parseBasicType(consume(), Type)) {
+ if (parseBasicType(C, Type)) {
switch (Type) {
case BasicType::I8:
case BasicType::I16:
@@ -652,10 +659,11 @@ void Demangler::demangleConst() {
print('_');
break;
default:
- // FIXME demangle backreferences.
Error = true;
break;
}
+ } else if (C == 'B') {
+ demangleBackref([&] { demangleConst(); });
} else {
Error = true;
}