summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMilian Wolff <milian.wolff@kdab.com>2020-05-16 00:09:10 +0200
committerMilian Wolff <milian.wolff@kdab.com>2020-09-09 09:00:46 +0000
commit31bebe3c6cb844d850cc755678f3b9d3c85362ca (patch)
tree5b706935f1eca5b0fc69ab15695fc42709dc0e08
parentc03eadefda856ffa5f9b0eb48686a5a8af39875a (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.txt5
-rw-r--r--app/CMakeLists.txt6
-rw-r--r--app/perfsymboltable.cpp15
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;