]> granicus.if.org Git - llvm/commitdiff
Add __[_[_]]Z demangling to new common demangle function
authorJames Henderson <jh7370@my.bristol.ac.uk>
Fri, 18 Jan 2019 13:58:41 +0000 (13:58 +0000)
committerJames Henderson <jh7370@my.bristol.ac.uk>
Fri, 18 Jan 2019 13:58:41 +0000 (13:58 +0000)
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

lib/Demangle/Demangle.cpp
unittests/Demangle/DemangleTest.cpp

index 8a37b92fc35fb964f0d536483008cbf2af55725b..a2804dfc2c113cda8ad545aed01ee28d45a423c0 100644 (file)
 
 #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 =
index f60122cc1374e89b0f44a0c6beb296306c172c3b..be564b330a07b00666fa9628f0ba323c8fedbeda 100644 (file)
 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");
 }