Improve sampling profiler CLI JSC tool
authorsbarati@apple.com <sbarati@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 21 Apr 2016 00:55:03 +0000 (00:55 +0000)
committersbarati@apple.com <sbarati@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 21 Apr 2016 00:55:03 +0000 (00:55 +0000)
https://bugs.webkit.org/show_bug.cgi?id=156824

Reviewed by Mark Lam.

This patch enhances the Sampling Profiler CLI tool from the JSC shell
to display the JITType of a particular CodeBlock. Because this happens
once we process a log of stack frames, the data for a particular frame
being in LLInt vs. Baseline could be wrong. For example, we may have taken
a stack trace of a CodeBlock while it was executing in the LLInt, then
it tiers up to the baseline, then we process the log. We will show such CodeBlocks
as being in the baseline JIT. We could be smarter about this in the future if
it turns out to truly be a problem.

This patch also adds a 'samplingProfilerTimingInterval' JSC option to allow
CLI users to control the sleep time between stack traces.

* jsc.cpp:
(jscmain):
* runtime/Options.h:
* runtime/SamplingProfiler.cpp:
(JSC::SamplingProfiler::SamplingProfiler):
(JSC::SamplingProfiler::processUnverifiedStackTraces):
(JSC::SamplingProfiler::reportTopBytecodes):
* runtime/SamplingProfiler.h:
(JSC::SamplingProfiler::StackFrame::hasExpressionInfo):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@199800 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/jsc.cpp
Source/JavaScriptCore/runtime/Options.h
Source/JavaScriptCore/runtime/SamplingProfiler.cpp
Source/JavaScriptCore/runtime/SamplingProfiler.h

index 3e930b5..125782d 100644 (file)
@@ -1,3 +1,32 @@
+2016-04-20  Saam barati  <sbarati@apple.com>
+
+        Improve sampling profiler CLI JSC tool
+        https://bugs.webkit.org/show_bug.cgi?id=156824
+
+        Reviewed by Mark Lam.
+
+        This patch enhances the Sampling Profiler CLI tool from the JSC shell
+        to display the JITType of a particular CodeBlock. Because this happens
+        once we process a log of stack frames, the data for a particular frame
+        being in LLInt vs. Baseline could be wrong. For example, we may have taken 
+        a stack trace of a CodeBlock while it was executing in the LLInt, then 
+        it tiers up to the baseline, then we process the log. We will show such CodeBlocks
+        as being in the baseline JIT. We could be smarter about this in the future if
+        it turns out to truly be a problem.
+
+        This patch also adds a 'samplingProfilerTimingInterval' JSC option to allow
+        CLI users to control the sleep time between stack traces.
+
+        * jsc.cpp:
+        (jscmain):
+        * runtime/Options.h:
+        * runtime/SamplingProfiler.cpp:
+        (JSC::SamplingProfiler::SamplingProfiler):
+        (JSC::SamplingProfiler::processUnverifiedStackTraces):
+        (JSC::SamplingProfiler::reportTopBytecodes):
+        * runtime/SamplingProfiler.h:
+        (JSC::SamplingProfiler::StackFrame::hasExpressionInfo):
+
 2016-04-20  Benjamin Poulain  <bpoulain@apple.com>
 
         [JSC] DFG should not generate two jumps when the target of DoubleBranch is the next block  
index 908ac59..52c6c74 100644 (file)
@@ -2275,6 +2275,7 @@ int jscmain(int argc, char** argv)
 
     if (options.m_dumpSamplingProfilerData) {
 #if ENABLE(SAMPLING_PROFILER)
+        JSLockHolder locker(vm);
         vm->samplingProfiler()->reportTopFunctions();
         vm->samplingProfiler()->reportTopBytecodes();
 #else
index 38a8cba..13708ad 100644 (file)
@@ -318,6 +318,7 @@ typedef const char* optionString;
     v(bool, useTypeProfiler, false, nullptr) \
     v(bool, useControlFlowProfiler, false, nullptr) \
     v(bool, useSamplingProfiler, false, nullptr) \
+    v(unsigned, samplingProfilerTimingInterval, 1000, "Time between stack traces in microseconds.") \
     v(bool, collectSamplingProfilerDataForJSCShell, false, "This corresponds to the JSC shell's --reportSamplingProfilerData option.") \
     v(bool, alwaysGeneratePCToCodeOriginMap, false, "This will make sure we always generate a PCToCodeOriginMap for JITed code.") \
     \
index f7ead12..eaac7c5 100644 (file)
@@ -185,7 +185,7 @@ private:
 SamplingProfiler::SamplingProfiler(VM& vm, RefPtr<Stopwatch>&& stopwatch)
     : m_vm(vm)
     , m_stopwatch(WTFMove(stopwatch))
-    , m_timingInterval(std::chrono::microseconds(1000))
+    , m_timingInterval(std::chrono::microseconds(Options::samplingProfilerTimingInterval()))
     , m_threadIdentifier(0)
     , m_jscExecutionThread(nullptr)
     , m_isPaused(false)
@@ -368,8 +368,10 @@ void SamplingProfiler::processUnverifiedStackTraces()
                     stackTrace.frames.last().lineNumber, stackTrace.frames.last().columnNumber);
                 stackTrace.frames.last().bytecodeIndex = bytecodeIndex;
             }
-            if (Options::collectSamplingProfilerDataForJSCShell())
+            if (Options::collectSamplingProfilerDataForJSCShell()) {
                 stackTrace.frames.last().codeBlockHash = codeBlock->hash();
+                stackTrace.frames.last().jitType = codeBlock->jitType();
+            }
         };
 
         auto appendEmptyFrame = [&] {
@@ -832,7 +834,7 @@ void SamplingProfiler::reportTopBytecodes()
         } else
             codeBlockHash = "<nil>";
 
-        String frameDescription = makeString(frame.displayName(m_vm), "#", codeBlockHash, ":", bytecodeIndex);
+        String frameDescription = makeString(frame.displayName(m_vm), "#", codeBlockHash, ":", JITCode::typeName(frame.jitType), ":", bytecodeIndex);
         bytecodeCounts.add(frameDescription, 0).iterator->value++;
     }
 
@@ -851,7 +853,7 @@ void SamplingProfiler::reportTopBytecodes()
     };
 
     dataLog("\n\nSampling rate: ", m_timingInterval.count(), " microseconds\n");
-    dataLog("Hottest bytecodes as <numSamples   'functionName#hash:bytecodeIndex'>\n");
+    dataLog("Hottest bytecodes as <numSamples   'functionName#hash:JITType:bytecodeIndex'>\n");
     for (size_t i = 0; i < 80; i++) {
         auto pair = takeMax();
         if (pair.first.isEmpty())
index a4cffc3..80cbafa 100644 (file)
@@ -30,6 +30,7 @@
 
 #include "CallFrame.h"
 #include "CodeBlockHash.h"
+#include "JITCode.h"
 #include "MachineStackMarker.h"
 #include <wtf/HashSet.h>
 #include <wtf/Lock.h>
@@ -86,6 +87,7 @@ public:
         unsigned columnNumber { std::numeric_limits<unsigned>::max() };
         unsigned bytecodeIndex { std::numeric_limits<unsigned>::max() };
         CodeBlockHash codeBlockHash;
+        JITCode::JITType jitType { JITCode::None };
 
         bool hasExpressionInfo() const
         {