From: Tomasz Miąsko Date: Thu, 17 Jun 2021 08:30:04 +0000 (+0200) Subject: [Demangle] Support Rust v0 mangling scheme in llvm::demangle X-Git-Tag: llvmorg-14-init~3739 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9b1085604ecf3d2d1a416ee658bca981af133128;p=platform%2Fupstream%2Fllvm.git [Demangle] Support Rust v0 mangling scheme in llvm::demangle The llvm::demangle is currently used by llvm-objdump and llvm-readobj, so this effectively adds support for Rust v0 mangling to those applications. Reviewed By: dblaikie Differential Revision: https://reviews.llvm.org/D104340 --- diff --git a/llvm/lib/Demangle/Demangle.cpp b/llvm/lib/Demangle/Demangle.cpp index 000f75b..1851fb7 100644 --- a/llvm/lib/Demangle/Demangle.cpp +++ b/llvm/lib/Demangle/Demangle.cpp @@ -19,10 +19,17 @@ static bool isItaniumEncoding(const std::string &MangledName) { return Pos > 0 && Pos <= 4 && MangledName[Pos] == 'Z'; } +static bool isRustEncoding(const std::string &MangledName) { + return MangledName.size() >= 2 && MangledName[0] == '_' && + MangledName[1] == 'R'; +} + std::string llvm::demangle(const std::string &MangledName) { char *Demangled; if (isItaniumEncoding(MangledName)) Demangled = itaniumDemangle(MangledName.c_str(), nullptr, nullptr, nullptr); + else if (isRustEncoding(MangledName)) + Demangled = rustDemangle(MangledName.c_str(), nullptr, nullptr, nullptr); else Demangled = microsoftDemangle(MangledName.c_str(), nullptr, nullptr, nullptr, nullptr); diff --git a/llvm/unittests/Demangle/DemangleTest.cpp b/llvm/unittests/Demangle/DemangleTest.cpp index 1216d2c..b7b31f9 100644 --- a/llvm/unittests/Demangle/DemangleTest.cpp +++ b/llvm/unittests/Demangle/DemangleTest.cpp @@ -21,6 +21,7 @@ TEST(Demangle, demangleTest) { "invocation function for block in foo(int)"); EXPECT_EQ(demangle("?foo@@YAXH@Z"), "void __cdecl foo(int)"); EXPECT_EQ(demangle("foo"), "foo"); + EXPECT_EQ(demangle("_RNvC3foo3bar"), "foo::bar"); // Regression test for demangling of optional template-args for vendor // extended type qualifier (https://bugs.llvm.org/show_bug.cgi?id=48009)