From: James Henderson Date: Fri, 18 Jan 2019 13:58:41 +0000 (+0000) Subject: Add __[_[_]]Z demangling to new common demangle function X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c020a4b755ac300940efd17a53c7c83bc6b8c325;p=llvm Add __[_[_]]Z demangling to new common demangle function This is a follow-up to r351448. It adds support for other _*Z extensions of the Itanium demanling, to the newly available demangle function heuristic. Reviewed by: erik.pilkington, rupprecht, grimar Differential Revision: https://reviews.llvm.org/D56855 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351551 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Demangle/Demangle.cpp b/lib/Demangle/Demangle.cpp index 8a37b92fc35..a2804dfc2c1 100644 --- a/lib/Demangle/Demangle.cpp +++ b/lib/Demangle/Demangle.cpp @@ -13,9 +13,15 @@ #include "llvm/Demangle/Demangle.h" +static bool isItaniumEncoding(const std::string &MangledName) { + size_t Pos = MangledName.find_first_not_of('_'); + // A valid Itanium encoding requires 1-4 leading underscores, followed by 'Z'. + return Pos > 0 && Pos <= 4 && MangledName[Pos] == 'Z'; +} + std::string llvm::demangle(const std::string &MangledName) { char *Demangled; - if (MangledName.compare(0, 2, "_Z") == 0) + if (isItaniumEncoding(MangledName)) Demangled = itaniumDemangle(MangledName.c_str(), nullptr, nullptr, nullptr); else Demangled = diff --git a/unittests/Demangle/DemangleTest.cpp b/unittests/Demangle/DemangleTest.cpp index f60122cc137..be564b330a0 100644 --- a/unittests/Demangle/DemangleTest.cpp +++ b/unittests/Demangle/DemangleTest.cpp @@ -13,7 +13,13 @@ using namespace llvm; TEST(Demangle, demangleTest) { + EXPECT_EQ(demangle("_"), "_"); EXPECT_EQ(demangle("_Z3fooi"), "foo(int)"); + EXPECT_EQ(demangle("__Z3fooi"), "foo(int)"); + EXPECT_EQ(demangle("___Z3fooi_block_invoke"), + "invocation function for block in foo(int)"); + EXPECT_EQ(demangle("____Z3fooi_block_invoke"), + "invocation function for block in foo(int)"); EXPECT_EQ(demangle("?foo@@YAXH@Z"), "void __cdecl foo(int)"); EXPECT_EQ(demangle("foo"), "foo"); }