diff options
author | Milian Wolff <milian.wolff@kdab.com> | 2020-05-16 00:09:10 +0200 |
---|---|---|
committer | Milian Wolff <milian.wolff@kdab.com> | 2020-09-09 09:00:46 +0000 |
commit | 31bebe3c6cb844d850cc755678f3b9d3c85362ca (patch) | |
tree | 5b706935f1eca5b0fc69ab15695fc42709dc0e08 | |
parent | c03eadefda856ffa5f9b0eb48686a5a8af39875a (diff) |
Add optional rust demangling support in perfparser
When librustc_demangle.so and rustc_demangle.h are provided
externally, perfparser can now leverage that to demangle rust
symbols.
See also: https://github.com/alexcrichton/rustc-demangle
Relates-To: https://github.com/KDAB/hotspot/issues/237
Change-Id: I0a66598e4ae3aa1dbf2776587934677beadd5968
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
-rw-r--r-- | CMakeLists.txt | 5 | ||||
-rw-r--r-- | app/CMakeLists.txt | 6 | ||||
-rw-r--r-- | app/perfsymboltable.cpp | 15 |
3 files changed, 23 insertions, 3 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 8be664e..dc4336c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,5 +5,10 @@ if (NOT elfutils_FOUND) return() endif() +set(RUSTC_DEMANGLE_INCLUDE_DIR "" CACHE STRING "Path to the folder containing rustc_demangle.h from https://github.com/alexcrichton/rustc-demangle") +set(RUSTC_DEMANGLE_LIBRARY "" CACHE STRING "Path to the librustc_demangle.so library from https://github.com/alexcrichton/rustc-demangle") +option(WITH_RUSTC_DEMANGLE "Build rust demangle support" OFF) +add_feature_info("Rust demangler for perfparser" WITH_RUSTC_DEMANGLE "Requires RUSTC_DEMANGLE_INCLUDE_DIR and RUSTC_DEMANGLE_LIBRARY to be specified") + add_subdirectory(app) add_subdirectory(tests) diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index b96a2b0..414e67c 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -22,6 +22,12 @@ add_qtc_library(perfparser_lib STATIC perftracingdata.cpp perftracingdata.h ) +if (WITH_RUSTC_DEMANGLE) + target_include_directories(perfparser_lib PRIVATE ${RUSTC_DEMANGLE_INCLUDE_DIR}) + target_link_libraries(perfparser_lib PRIVATE ${RUSTC_DEMANGLE_LIBRARY}) + target_compile_definitions(perfparser_lib PRIVATE HAVE_RUSTC_DEMANGLE=1) +endif() + add_qtc_executable(perfparser DEPENDS perfparser_lib diff --git a/app/perfsymboltable.cpp b/app/perfsymboltable.cpp index a94d159..aabbb9a 100644 --- a/app/perfsymboltable.cpp +++ b/app/perfsymboltable.cpp @@ -50,6 +50,10 @@ #define O_BINARY 0 #endif +#ifdef HAVE_RUSTC_DEMANGLE +#include <rustc_demangle.h> +#endif + PerfSymbolTable::PerfSymbolTable(qint32 pid, Dwfl_Callbacks *callbacks, PerfUnwind *parent) : m_perfMapFile(QDir::tempPath() + QDir::separator() + QString::fromLatin1("perf-%1.map").arg(pid)), @@ -334,13 +338,18 @@ static QByteArray demangle(const QByteArray &mangledName) if (mangledName.length() < 3) { return mangledName; } else { - static size_t demangleBufferLength = 0; - static char *demangleBuffer = nullptr; + static size_t demangleBufferLength = 1024; + static char *demangleBuffer = reinterpret_cast<char *>(eu_compat_malloc(demangleBufferLength)); + +#ifdef HAVE_RUSTC_DEMANGLE + if (rustc_demangle(mangledName.constData(), demangleBuffer, demangleBufferLength)) + return demangleBuffer; +#endif // Require GNU v3 ABI by the "_Z" prefix. if (mangledName[0] == '_' && mangledName[1] == 'Z') { int status = -1; - char *dsymname = eu_compat_demangle(mangledName, demangleBuffer, &demangleBufferLength, + char *dsymname = eu_compat_demangle(mangledName.constData(), demangleBuffer, &demangleBufferLength, &status); if (status == 0) return demangleBuffer = dsymname; |