From 795086b4cfd89f2fb722ec1fdd90048a5ec17947 Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Fri, 10 Jan 2020 23:41:40 -0800 Subject: [PATCH] Fix Demangle when used standalone (#2256) --- .../src/main/native/include/wpi/Demangle.h | 6 +++-- wpiutil/src/main/native/unix/Demangle.cpp | 26 +++++++++---------- wpiutil/src/main/native/unix/StackTrace.cpp | 9 +++++-- wpiutil/src/main/native/windows/Demangle.cpp | 13 ++++++---- 4 files changed, 32 insertions(+), 22 deletions(-) diff --git a/wpiutil/src/main/native/include/wpi/Demangle.h b/wpiutil/src/main/native/include/wpi/Demangle.h index b0e1134ec4..5989ccc3ed 100644 --- a/wpiutil/src/main/native/include/wpi/Demangle.h +++ b/wpiutil/src/main/native/include/wpi/Demangle.h @@ -1,5 +1,5 @@ /*----------------------------------------------------------------------------*/ -/* Copyright (c) 2008-2019 FIRST. All Rights Reserved. */ +/* Copyright (c) 2008-2020 FIRST. All Rights Reserved. */ /* Open Source Software - may be modified and shared by FRC teams. The code */ /* must be accompanied by the FIRST BSD license file in the root directory of */ /* the project. */ @@ -10,6 +10,8 @@ #include +#include "wpi/Twine.h" + namespace wpi { /** @@ -18,7 +20,7 @@ namespace wpi { * @param mangledSymbol the mangled symbol. * @return The demangled symbol, or mangledSymbol if demangling fails. */ -std::string Demangle(char const* mangledSymbol); +std::string Demangle(const Twine& mangledSymbol); } // namespace wpi diff --git a/wpiutil/src/main/native/unix/Demangle.cpp b/wpiutil/src/main/native/unix/Demangle.cpp index 1ce4f31583..34530842bd 100644 --- a/wpiutil/src/main/native/unix/Demangle.cpp +++ b/wpiutil/src/main/native/unix/Demangle.cpp @@ -1,5 +1,5 @@ /*----------------------------------------------------------------------------*/ -/* Copyright (c) 2008-2019 FIRST. All Rights Reserved. */ +/* Copyright (c) 2008-2020 FIRST. All Rights Reserved. */ /* Open Source Software - may be modified and shared by FRC teams. The code */ /* must be accompanied by the FIRST BSD license file in the root directory of */ /* the project. */ @@ -11,26 +11,26 @@ #include +#include "wpi/SmallString.h" + namespace wpi { -std::string Demangle(char const* mangledSymbol) { - char buffer[256]; +std::string Demangle(const Twine& mangledSymbol) { + SmallString<128> buf; size_t length; int32_t status; - if (std::sscanf(mangledSymbol, "%*[^(]%*[(]%255[^)+]", buffer)) { - char* symbol = abi::__cxa_demangle(buffer, nullptr, &length, &status); - if (status == 0) { - return symbol; - } else { - // If the symbol couldn't be demangled, it's probably a C function, - // so just return it as-is. - return buffer; - } + char* symbol = + abi::__cxa_demangle(mangledSymbol.toNullTerminatedStringRef(buf).data(), + nullptr, &length, &status); + if (status == 0) { + std::string rv{symbol}; + std::free(symbol); + return rv; } // If everything else failed, just return the mangled symbol - return mangledSymbol; + return mangledSymbol.str(); } } // namespace wpi diff --git a/wpiutil/src/main/native/unix/StackTrace.cpp b/wpiutil/src/main/native/unix/StackTrace.cpp index be280800c1..004eb39ad1 100644 --- a/wpiutil/src/main/native/unix/StackTrace.cpp +++ b/wpiutil/src/main/native/unix/StackTrace.cpp @@ -1,5 +1,5 @@ /*----------------------------------------------------------------------------*/ -/* Copyright (c) 2008-2019 FIRST. All Rights Reserved. */ +/* Copyright (c) 2008-2020 FIRST. All Rights Reserved. */ /* Open Source Software - may be modified and shared by FRC teams. The code */ /* must be accompanied by the FIRST BSD license file in the root directory of */ /* the project. */ @@ -11,6 +11,7 @@ #include "wpi/Demangle.h" #include "wpi/SmallString.h" +#include "wpi/StringRef.h" #include "wpi/raw_ostream.h" namespace wpi { @@ -25,7 +26,11 @@ std::string GetStackTrace(int offset) { for (int i = offset; i < stackSize; i++) { // Only print recursive functions once in a row. if (i == 0 || stackTrace[i] != stackTrace[i - 1]) { - trace << "\tat " << Demangle(mangledSymbols[i]) << "\n"; + // extract just function name from "pathToExe(functionName+offset)" + StringRef sym{mangledSymbols[i]}; + sym = sym.split('(').second; + sym = sym.split('+').first; + trace << "\tat " << Demangle(sym) << "\n"; } } diff --git a/wpiutil/src/main/native/windows/Demangle.cpp b/wpiutil/src/main/native/windows/Demangle.cpp index 34d1cabc61..a1560d64c1 100644 --- a/wpiutil/src/main/native/windows/Demangle.cpp +++ b/wpiutil/src/main/native/windows/Demangle.cpp @@ -1,5 +1,5 @@ /*----------------------------------------------------------------------------*/ -/* Copyright (c) 2008-2019 FIRST. All Rights Reserved. */ +/* Copyright (c) 2008-2020 FIRST. All Rights Reserved. */ /* Open Source Software - may be modified and shared by FRC teams. The code */ /* must be accompanied by the FIRST BSD license file in the root directory of */ /* the project. */ @@ -11,19 +11,22 @@ #include +#include "wpi/SmallString.h" #include "wpi/mutex.h" #pragma comment(lib, "Dbghelp.lib") namespace wpi { -std::string Demangle(char const* mangledSymbol) { +std::string Demangle(const Twine& mangledSymbol) { static wpi::mutex m; std::scoped_lock lock(m); + SmallString<128> buf; char buffer[256]; - DWORD sz = UnDecorateSymbolName(mangledSymbol, buffer, sizeof(buffer), - UNDNAME_COMPLETE); - if (sz == 0) return mangledSymbol; + DWORD sz = + UnDecorateSymbolName(mangledSymbol.toNullTerminatedStringRef(buf).data(), + buffer, sizeof(buffer), UNDNAME_COMPLETE); + if (sz == 0) return mangledSymbol.str(); return std::string(buffer, sz); }