[llvm] r351551 - Add __[_[_]]Z demangling to new common demangle function
James Henderson via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 18 05:58:41 PST 2019
Author: jhenderson
Date: Fri Jan 18 05:58:41 2019
New Revision: 351551
URL: http://llvm.org/viewvc/llvm-project?rev=351551&view=rev
Log:
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
Modified:
llvm/trunk/lib/Demangle/Demangle.cpp
llvm/trunk/unittests/Demangle/DemangleTest.cpp
Modified: llvm/trunk/lib/Demangle/Demangle.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Demangle/Demangle.cpp?rev=351551&r1=351550&r2=351551&view=diff
==============================================================================
--- llvm/trunk/lib/Demangle/Demangle.cpp (original)
+++ llvm/trunk/lib/Demangle/Demangle.cpp Fri Jan 18 05:58:41 2019
@@ -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 =
Modified: llvm/trunk/unittests/Demangle/DemangleTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Demangle/DemangleTest.cpp?rev=351551&r1=351550&r2=351551&view=diff
==============================================================================
--- llvm/trunk/unittests/Demangle/DemangleTest.cpp (original)
+++ llvm/trunk/unittests/Demangle/DemangleTest.cpp Fri Jan 18 05:58:41 2019
@@ -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 at Z"), "void __cdecl foo(int)");
EXPECT_EQ(demangle("foo"), "foo");
}
More information about the llvm-commits
mailing list