[WTF] Move JSC tools/StackTrace to WTF and unify stack trace dump code
https://bugs.webkit.org/show_bug.cgi?id=171199
Reviewed by Mark Lam.
Source/JavaScriptCore:
This patch adds a utility method to produce demangled names with dladdr.
It fixes several memory leaks because the result of abi::__cxa_demangle()
needs to be `free`-ed.
* CMakeLists.txt:
* JavaScriptCore.xcodeproj/project.pbxproj:
* inspector/JSGlobalObjectInspectorController.cpp:
(Inspector::JSGlobalObjectInspectorController::appendAPIBacktrace):
* runtime/SamplingProfiler.cpp:
(JSC::SamplingProfiler::StackFrame::displayName):
* tools/CellProfile.h:
* tools/CodeProfile.cpp:
(JSC::CodeProfile::report):
(JSC::symbolName): Deleted.
Source/WTF:
JSC tools/StackTrace's dump code is almost identical to WTF Assertions'
stack trace dump code. This patch moves tools/StackTrace to WTF and use
it in Assertions. It unifies the two duplicate implementations into one.
* WTF.xcodeproj/project.pbxproj:
* wtf/Assertions.cpp:
* wtf/CMakeLists.txt:
* wtf/Platform.h:
* wtf/StackTrace.cpp: Renamed from Source/JavaScriptCore/tools/StackTrace.cpp.
(WTF::StackTrace::captureStackTrace):
(WTF::StackTrace::dump):
* wtf/StackTrace.h: Copied from Source/JavaScriptCore/tools/StackTrace.h.
(WTF::StackTrace::StackTrace):
(WTF::StackTrace::stack):
(WTF::StackTrace::DemangleEntry::mangledName):
(WTF::StackTrace::DemangleEntry::demangledName):
(WTF::StackTrace::DemangleEntry::DemangleEntry):
* wtf/SystemFree.h: Renamed from Source/JavaScriptCore/tools/StackTrace.h.
(WTF::SystemFree::operator()):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@215715 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/JavaScriptCore/runtime/SamplingProfiler.cpp b/Source/JavaScriptCore/runtime/SamplingProfiler.cpp
index c4604d4..90ddd22 100644
--- a/Source/JavaScriptCore/runtime/SamplingProfiler.cpp
+++ b/Source/JavaScriptCore/runtime/SamplingProfiler.cpp
@@ -48,13 +48,9 @@
#include "VM.h"
#include <wtf/HashSet.h>
#include <wtf/RefPtr.h>
+#include <wtf/StackTrace.h>
#include <wtf/text/StringBuilder.h>
-#if OS(DARWIN) || OS(LINUX)
-#include <cxxabi.h>
-#include <dlfcn.h>
-#endif
-
namespace JSC {
static double sNumTotalStackTraces = 0;
@@ -750,17 +746,11 @@
}
if (frameType == FrameType::Unknown || frameType == FrameType::C) {
-#if OS(DARWIN) || OS(LINUX)
+#if HAVE(DLADDR)
if (frameType == FrameType::C) {
- const char* mangledName = nullptr;
- const char* cxaDemangled = nullptr;
- Dl_info info;
- if (dladdr(cCodePC, &info) && info.dli_sname)
- mangledName = info.dli_sname;
- if (mangledName) {
- cxaDemangled = abi::__cxa_demangle(mangledName, 0, 0, 0);
- return String(cxaDemangled ? cxaDemangled : mangledName);
- }
+ auto demangled = WTF::StackTrace::demangle(cCodePC);
+ if (demangled)
+ return String(demangled->demangledName() ? demangled->demangledName() : demangled->mangledName());
WTF::dataLog("couldn't get a name");
}
#endif