<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[199800] trunk/Source/JavaScriptCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/199800">199800</a></dd>
<dt>Author</dt> <dd>sbarati@apple.com</dd>
<dt>Date</dt> <dd>2016-04-20 17:55:03 -0700 (Wed, 20 Apr 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>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):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCorejsccpp">trunk/Source/JavaScriptCore/jsc.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeOptionsh">trunk/Source/JavaScriptCore/runtime/Options.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeSamplingProfilercpp">trunk/Source/JavaScriptCore/runtime/SamplingProfiler.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeSamplingProfilerh">trunk/Source/JavaScriptCore/runtime/SamplingProfiler.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (199799 => 199800)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2016-04-21 00:35:18 UTC (rev 199799)
+++ trunk/Source/JavaScriptCore/ChangeLog        2016-04-21 00:55:03 UTC (rev 199800)
</span><span class="lines">@@ -1,3 +1,32 @@
</span><ins>+2016-04-20  Saam barati  &lt;sbarati@apple.com&gt;
+
+        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):
+
</ins><span class="cx"> 2016-04-20  Benjamin Poulain  &lt;bpoulain@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [JSC] DFG should not generate two jumps when the target of DoubleBranch is the next block  
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejsccpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jsc.cpp (199799 => 199800)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jsc.cpp        2016-04-21 00:35:18 UTC (rev 199799)
+++ trunk/Source/JavaScriptCore/jsc.cpp        2016-04-21 00:55:03 UTC (rev 199800)
</span><span class="lines">@@ -2275,6 +2275,7 @@
</span><span class="cx"> 
</span><span class="cx">     if (options.m_dumpSamplingProfilerData) {
</span><span class="cx"> #if ENABLE(SAMPLING_PROFILER)
</span><ins>+        JSLockHolder locker(vm);
</ins><span class="cx">         vm-&gt;samplingProfiler()-&gt;reportTopFunctions();
</span><span class="cx">         vm-&gt;samplingProfiler()-&gt;reportTopBytecodes();
</span><span class="cx"> #else
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeOptionsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Options.h (199799 => 199800)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Options.h        2016-04-21 00:35:18 UTC (rev 199799)
+++ trunk/Source/JavaScriptCore/runtime/Options.h        2016-04-21 00:55:03 UTC (rev 199800)
</span><span class="lines">@@ -318,6 +318,7 @@
</span><span class="cx">     v(bool, useTypeProfiler, false, nullptr) \
</span><span class="cx">     v(bool, useControlFlowProfiler, false, nullptr) \
</span><span class="cx">     v(bool, useSamplingProfiler, false, nullptr) \
</span><ins>+    v(unsigned, samplingProfilerTimingInterval, 1000, &quot;Time between stack traces in microseconds.&quot;) \
</ins><span class="cx">     v(bool, collectSamplingProfilerDataForJSCShell, false, &quot;This corresponds to the JSC shell's --reportSamplingProfilerData option.&quot;) \
</span><span class="cx">     v(bool, alwaysGeneratePCToCodeOriginMap, false, &quot;This will make sure we always generate a PCToCodeOriginMap for JITed code.&quot;) \
</span><span class="cx">     \
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeSamplingProfilercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/SamplingProfiler.cpp (199799 => 199800)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/SamplingProfiler.cpp        2016-04-21 00:35:18 UTC (rev 199799)
+++ trunk/Source/JavaScriptCore/runtime/SamplingProfiler.cpp        2016-04-21 00:55:03 UTC (rev 199800)
</span><span class="lines">@@ -185,7 +185,7 @@
</span><span class="cx"> SamplingProfiler::SamplingProfiler(VM&amp; vm, RefPtr&lt;Stopwatch&gt;&amp;&amp; stopwatch)
</span><span class="cx">     : m_vm(vm)
</span><span class="cx">     , m_stopwatch(WTFMove(stopwatch))
</span><del>-    , m_timingInterval(std::chrono::microseconds(1000))
</del><ins>+    , m_timingInterval(std::chrono::microseconds(Options::samplingProfilerTimingInterval()))
</ins><span class="cx">     , m_threadIdentifier(0)
</span><span class="cx">     , m_jscExecutionThread(nullptr)
</span><span class="cx">     , m_isPaused(false)
</span><span class="lines">@@ -368,8 +368,10 @@
</span><span class="cx">                     stackTrace.frames.last().lineNumber, stackTrace.frames.last().columnNumber);
</span><span class="cx">                 stackTrace.frames.last().bytecodeIndex = bytecodeIndex;
</span><span class="cx">             }
</span><del>-            if (Options::collectSamplingProfilerDataForJSCShell())
</del><ins>+            if (Options::collectSamplingProfilerDataForJSCShell()) {
</ins><span class="cx">                 stackTrace.frames.last().codeBlockHash = codeBlock-&gt;hash();
</span><ins>+                stackTrace.frames.last().jitType = codeBlock-&gt;jitType();
+            }
</ins><span class="cx">         };
</span><span class="cx"> 
</span><span class="cx">         auto appendEmptyFrame = [&amp;] {
</span><span class="lines">@@ -832,7 +834,7 @@
</span><span class="cx">         } else
</span><span class="cx">             codeBlockHash = &quot;&lt;nil&gt;&quot;;
</span><span class="cx"> 
</span><del>-        String frameDescription = makeString(frame.displayName(m_vm), &quot;#&quot;, codeBlockHash, &quot;:&quot;, bytecodeIndex);
</del><ins>+        String frameDescription = makeString(frame.displayName(m_vm), &quot;#&quot;, codeBlockHash, &quot;:&quot;, JITCode::typeName(frame.jitType), &quot;:&quot;, bytecodeIndex);
</ins><span class="cx">         bytecodeCounts.add(frameDescription, 0).iterator-&gt;value++;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -851,7 +853,7 @@
</span><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     dataLog(&quot;\n\nSampling rate: &quot;, m_timingInterval.count(), &quot; microseconds\n&quot;);
</span><del>-    dataLog(&quot;Hottest bytecodes as &lt;numSamples   'functionName#hash:bytecodeIndex'&gt;\n&quot;);
</del><ins>+    dataLog(&quot;Hottest bytecodes as &lt;numSamples   'functionName#hash:JITType:bytecodeIndex'&gt;\n&quot;);
</ins><span class="cx">     for (size_t i = 0; i &lt; 80; i++) {
</span><span class="cx">         auto pair = takeMax();
</span><span class="cx">         if (pair.first.isEmpty())
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeSamplingProfilerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/SamplingProfiler.h (199799 => 199800)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/SamplingProfiler.h        2016-04-21 00:35:18 UTC (rev 199799)
+++ trunk/Source/JavaScriptCore/runtime/SamplingProfiler.h        2016-04-21 00:55:03 UTC (rev 199800)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;CallFrame.h&quot;
</span><span class="cx"> #include &quot;CodeBlockHash.h&quot;
</span><ins>+#include &quot;JITCode.h&quot;
</ins><span class="cx"> #include &quot;MachineStackMarker.h&quot;
</span><span class="cx"> #include &lt;wtf/HashSet.h&gt;
</span><span class="cx"> #include &lt;wtf/Lock.h&gt;
</span><span class="lines">@@ -86,6 +87,7 @@
</span><span class="cx">         unsigned columnNumber { std::numeric_limits&lt;unsigned&gt;::max() };
</span><span class="cx">         unsigned bytecodeIndex { std::numeric_limits&lt;unsigned&gt;::max() };
</span><span class="cx">         CodeBlockHash codeBlockHash;
</span><ins>+        JITCode::JITType jitType { JITCode::None };
</ins><span class="cx"> 
</span><span class="cx">         bool hasExpressionInfo() const
</span><span class="cx">         {
</span></span></pre>
</div>
</div>

</body>
</html>