Skip to content

Commit 82b7e82

Browse files
committed
[Demangle][Rust] Parse path backreferences
Reviewed By: dblaikie Differential Revision: https://reviews.llvm.org/D103459
1 parent 392af6a commit 82b7e82

File tree

3 files changed

+36
-1
lines changed

3 files changed

+36
-1
lines changed

llvm/include/llvm/Demangle/RustDemangle.h

+15
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,21 @@ class Demangler {
102102
void demangleConstBool();
103103
void demangleConstChar();
104104

105+
template <typename Callable> void demangleBackref(Callable Demangler) {
106+
uint64_t Backref = parseBase62Number();
107+
if (Error || Backref >= Position) {
108+
Error = true;
109+
return;
110+
}
111+
112+
if (!Print)
113+
return;
114+
115+
SwapAndRestore<size_t> SavePosition(Position, Position);
116+
Position = Backref;
117+
Demangler();
118+
}
119+
105120
Identifier parseIdentifier();
106121
uint64_t parseOptionalBase62Number(char Tag);
107122
uint64_t parseBase62Number();

llvm/lib/Demangle/RustDemangle.cpp

+5-1
Original file line numberDiff line numberDiff line change
@@ -232,8 +232,12 @@ bool Demangler::demanglePath(InType InType, LeaveOpen LeaveOpen) {
232232
print(">");
233233
break;
234234
}
235+
case 'B': {
236+
bool IsOpen = false;
237+
demangleBackref([&] { IsOpen = demanglePath(InType, LeaveOpen); });
238+
return IsOpen;
239+
}
235240
default:
236-
// FIXME parse remaining productions.
237241
Error = true;
238242
break;
239243
}

llvm/test/Demangle/rust.test

+16
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,22 @@ CHECK: char::<'\u{10ffff}'>
420420
CHECK: _RIC4charKc1234567_E
421421
_RIC4charKc1234567_E
422422

423+
; Backreferences
424+
425+
CHECK: backref::<backref::ident>
426+
_RIC7backrefNvB0_5identE
427+
428+
; Invalid backreferences
429+
430+
CHECK: _RB_
431+
_RB_
432+
433+
CHECK: _RB5_
434+
_RB5_
435+
436+
CHECK: _RNvB_1a
437+
_RNvB_1a
438+
423439
; Invalid mangled characters
424440

425441
CHECK: _RNvC2a.1c

0 commit comments

Comments
 (0)