diff --git a/llvm/test/tools/llvm-cxxfilt/coff-import.test b/llvm/test/tools/llvm-cxxfilt/coff-import.test --- a/llvm/test/tools/llvm-cxxfilt/coff-import.test +++ b/llvm/test/tools/llvm-cxxfilt/coff-import.test @@ -1,5 +1,12 @@ RUN: llvm-cxxfilt -_ ___imp__ZSt6futureIvE | FileCheck %s RUN: llvm-cxxfilt -n __imp__ZSt6futureIvE | FileCheck %s -CHECK: import thunk for std::future +## This should not demangle +RUN: llvm-cxxfilt -n __imp__foo | FileCheck %s --check-prefix=CHECK-STRING --match-full-lines + +RUN: echo "__imp__ZSt6futureIvE __imp__ZSt6futureIvE" | llvm-cxxfilt -n | \ +RUN: FileCheck %s --check-prefix=CHECK-SPLIT +CHECK: import thunk for std::future +CHECK-STRING: __imp__foo +CHECK-SPLIT: import thunk for std::future import thunk for std::future diff --git a/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp b/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp --- a/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp +++ b/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp @@ -74,8 +74,9 @@ return Triple(sys::getProcessTriple()).isOSBinFormatMachO(); } -static std::string demangle(llvm::raw_ostream &OS, const std::string &Mangled) { +static std::string demangle(const std::string &Mangled) { int Status; + std::string Prefix; const char *DecoratedStr = Mangled.c_str(); if (shouldStripUnderscore()) @@ -92,11 +93,11 @@ if (!Undecorated && (DecoratedLength > 6 && strncmp(DecoratedStr, "__imp_", 6) == 0)) { - OS << "import thunk for "; + Prefix = "import thunk for "; Undecorated = itaniumDemangle(DecoratedStr + 6, nullptr, nullptr, &Status); } - std::string Result(Undecorated ? Undecorated : Mangled); + std::string Result(Undecorated ? Prefix + Undecorated : Mangled); free(Undecorated); return Result; } @@ -144,9 +145,9 @@ SmallVector, 16> Words; SplitStringDelims(Mangled, Words, IsLegalItaniumChar); for (const auto &Word : Words) - Result += demangle(OS, Word.first) + Word.second.str(); + Result += ::demangle(Word.first) + Word.second.str(); } else - Result = demangle(OS, Mangled); + Result = ::demangle(Mangled); OS << Result << '\n'; OS.flush(); }