From 0096a0ae286152e54a38336531e7e93d10498eb3 Mon Sep 17 00:00:00 2001 From: Hans Wennborg Date: Tue, 24 Jan 2017 00:26:12 +0000 Subject: [PATCH] Merging r292467: ------------------------------------------------------------------------ r292467 | compnerd | 2017-01-18 18:58:46 -0800 (Wed, 18 Jan 2017) | 7 lines llvm-cxxfilt: filter out invalid manglings c++filt does not attempt to demangle symbols which do not match its expected format. This means that the symbol must start with _Z or ___Z (block invocation function extension). Any other symbols are returned as is. Note that this is different from the behaviour of __cxa_demangle which will demangle fragments. ------------------------------------------------------------------------ git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_40@292861 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/tools/llvm-cxxfilt/invalid.test | 6 ++++++ tools/llvm-cxxfilt/llvm-cxxfilt.cpp | 9 ++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 test/tools/llvm-cxxfilt/invalid.test diff --git a/test/tools/llvm-cxxfilt/invalid.test b/test/tools/llvm-cxxfilt/invalid.test new file mode 100644 index 00000000000..10f3b2e8132 --- /dev/null +++ b/test/tools/llvm-cxxfilt/invalid.test @@ -0,0 +1,6 @@ +RUN: llvm-cxxfilt _Z1fi __Z1fi f ___ZSt1ff_block_invoke | FileCheck %s + +CHECK: f(int) +CHECK-NEXT: __Z1fi +CHECK-NEXT: f +CHECK-NEXT: invocation function for block in std::f(float) diff --git a/tools/llvm-cxxfilt/llvm-cxxfilt.cpp b/tools/llvm-cxxfilt/llvm-cxxfilt.cpp index 80a54bbf63d..1e2797ba333 100644 --- a/tools/llvm-cxxfilt/llvm-cxxfilt.cpp +++ b/tools/llvm-cxxfilt/llvm-cxxfilt.cpp @@ -14,9 +14,12 @@ using namespace llvm; -static void demangle(llvm::raw_ostream &OS, const char *Mangled) { +static void demangle(llvm::raw_ostream &OS, const std::string &Mangled) { int Status; - char *Demangled = itaniumDemangle(Mangled, nullptr, nullptr, &Status); + char *Demangled = nullptr; + if ((Mangled.size() >= 2 && Mangled.compare(0, 2, "_Z")) || + (Mangled.size() >= 4 && Mangled.compare(0, 4, "___Z"))) + Demangled = itaniumDemangle(Mangled.c_str(), nullptr, nullptr, &Status); OS << (Demangled ? Demangled : Mangled) << '\n'; free(Demangled); } @@ -24,7 +27,7 @@ static void demangle(llvm::raw_ostream &OS, const char *Mangled) { int main(int argc, char **argv) { if (argc == 1) for (std::string Mangled; std::getline(std::cin, Mangled);) - demangle(llvm::outs(), Mangled.c_str()); + demangle(llvm::outs(), Mangled); else for (int I = 1; I < argc; ++I) demangle(llvm::outs(), argv[I]); -- 2.40.0