<!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>[160890] branches/jsCStack/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/160890">160890</a></dd>
<dt>Author</dt> <dd>mark.lam@apple.com</dd>
<dt>Date</dt> <dd>2013-12-19 18:38:00 -0800 (Thu, 19 Dec 2013)</dd>
</dl>

<h3>Log Message</h3>
<pre>CStack: The JIT does not need a slow path stack check.
https://bugs.webkit.org/show_bug.cgi?id=126036.

Reviewed by Geoffrey Garen.

The JIT uses the C stack which is not growable. If we fail a stack
check in the function header, then a stack overflow is imminent, and
there's no need to redo the check in the slow path helper.

Hence, renamed operationStackCheck() to operationThrowStackOverflowError()
and change the JIT and DFG code to use this appropriately.

* dfg/DFGJITCompiler.cpp:
(JSC::DFG::JITCompiler::compileFunction):
* jit/JIT.cpp:
(JSC::JIT::privateCompile):
* jit/JITOperations.cpp:
* jit/JITOperations.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#branchesjsCStackSourceJavaScriptCoreChangeLog">branches/jsCStack/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#branchesjsCStackSourceJavaScriptCoredfgDFGJITCompilercpp">branches/jsCStack/Source/JavaScriptCore/dfg/DFGJITCompiler.cpp</a></li>
<li><a href="#branchesjsCStackSourceJavaScriptCorejitJITcpp">branches/jsCStack/Source/JavaScriptCore/jit/JIT.cpp</a></li>
<li><a href="#branchesjsCStackSourceJavaScriptCorejitJITOperationscpp">branches/jsCStack/Source/JavaScriptCore/jit/JITOperations.cpp</a></li>
<li><a href="#branchesjsCStackSourceJavaScriptCorejitJITOperationsh">branches/jsCStack/Source/JavaScriptCore/jit/JITOperations.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="branchesjsCStackSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: branches/jsCStack/Source/JavaScriptCore/ChangeLog (160889 => 160890)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsCStack/Source/JavaScriptCore/ChangeLog        2013-12-20 02:01:42 UTC (rev 160889)
+++ branches/jsCStack/Source/JavaScriptCore/ChangeLog        2013-12-20 02:38:00 UTC (rev 160890)
</span><span class="lines">@@ -1,3 +1,24 @@
</span><ins>+2013-12-19  Mark Lam  &lt;mark.lam@apple.com&gt;
+
+        CStack: The JIT does not need a slow path stack check.
+        https://bugs.webkit.org/show_bug.cgi?id=126036.
+
+        Reviewed by Geoffrey Garen.
+
+        The JIT uses the C stack which is not growable. If we fail a stack
+        check in the function header, then a stack overflow is imminent, and
+        there's no need to redo the check in the slow path helper.
+
+        Hence, renamed operationStackCheck() to operationThrowStackOverflowError()
+        and change the JIT and DFG code to use this appropriately.
+
+        * dfg/DFGJITCompiler.cpp:
+        (JSC::DFG::JITCompiler::compileFunction):
+        * jit/JIT.cpp:
+        (JSC::JIT::privateCompile):
+        * jit/JITOperations.cpp:
+        * jit/JITOperations.h:
+
</ins><span class="cx"> 2013-12-19  Michael Saboff  &lt;msaboff@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         CStack Branch: Fix call operationStackCheck to check the proper stack
</span></span></pre></div>
<a id="branchesjsCStackSourceJavaScriptCoredfgDFGJITCompilercpp"></a>
<div class="modfile"><h4>Modified: branches/jsCStack/Source/JavaScriptCore/dfg/DFGJITCompiler.cpp (160889 => 160890)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsCStack/Source/JavaScriptCore/dfg/DFGJITCompiler.cpp        2013-12-20 02:01:42 UTC (rev 160889)
+++ branches/jsCStack/Source/JavaScriptCore/dfg/DFGJITCompiler.cpp        2013-12-20 02:38:00 UTC (rev 160890)
</span><span class="lines">@@ -327,9 +327,7 @@
</span><span class="cx">     Label fromArityCheck(this);
</span><span class="cx">     // Plant a check that sufficient space is available in the JSStack.
</span><span class="cx">     addPtr(TrustedImm32(virtualRegisterForLocal(m_graph.requiredRegisterCountForExecutionAndExit() - 1).offset() * sizeof(Register)), GPRInfo::callFrameRegister, GPRInfo::regT1);
</span><del>-    Jump stackCheck = branchPtr(Above, AbsoluteAddress(m_vm-&gt;addressOfJSStackLimit()), GPRInfo::regT1);
-    // Return here after stack check.
-    Label fromStackCheck = label();
</del><ins>+    Jump stackOverflow = branchPtr(Above, AbsoluteAddress(m_vm-&gt;addressOfJSStackLimit()), GPRInfo::regT1);
</ins><span class="cx"> 
</span><span class="cx">     checkStackPointerAlignment();
</span><span class="cx"> 
</span><span class="lines">@@ -344,17 +342,15 @@
</span><span class="cx"> 
</span><span class="cx">     // === Function footer code generation ===
</span><span class="cx">     //
</span><del>-    // Generate code to perform the slow stack check (if the fast one in
</del><ins>+    // Generate code to perform the stack overflow handling (if the stack check in
</ins><span class="cx">     // the function header fails), and generate the entry point with arity check.
</span><span class="cx">     //
</span><del>-    // Generate the stack check; if the fast check in the function head fails,
-    // we need to call out to a helper function to check whether more space is available.
-    // FIXME: change this from a cti call to a DFG style operation (normal C calling conventions).
-    stackCheck.link(this);
</del><ins>+    // Generate the stack overflow handling; if the stack check in the function head fails,
+    // we need to call out to a helper function to throw the StackOverflowError.
+    stackOverflow.link(this);
</ins><span class="cx"> 
</span><span class="cx">     emitStoreCodeOrigin(CodeOrigin(0));
</span><del>-    m_speculative-&gt;callOperationWithCallFrameRollbackOnException(operationStackCheck, m_codeBlock);
-    jump(fromStackCheck);
</del><ins>+    m_speculative-&gt;callOperationWithCallFrameRollbackOnException(operationThrowStackOverflowError, m_codeBlock);
</ins><span class="cx">     
</span><span class="cx">     // The fast entry point into a function does not check the correct number of arguments
</span><span class="cx">     // have been passed to the call (we only use the fast entry point where we can statically
</span></span></pre></div>
<a id="branchesjsCStackSourceJavaScriptCorejitJITcpp"></a>
<div class="modfile"><h4>Modified: branches/jsCStack/Source/JavaScriptCore/jit/JIT.cpp (160889 => 160890)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsCStack/Source/JavaScriptCore/jit/JIT.cpp        2013-12-20 02:01:42 UTC (rev 160889)
+++ branches/jsCStack/Source/JavaScriptCore/jit/JIT.cpp        2013-12-20 02:38:00 UTC (rev 160890)
</span><span class="lines">@@ -519,7 +519,7 @@
</span><span class="cx">     sampleInstruction(m_codeBlock-&gt;instructions().begin());
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    Jump stackCheck;
</del><ins>+    Jump stackOverflow;
</ins><span class="cx">     if (m_codeBlock-&gt;codeType() == FunctionCode) {
</span><span class="cx"> #if ENABLE(VALUE_PROFILER)
</span><span class="cx">         ASSERT(m_bytecodeOffset == (unsigned)-1);
</span><span class="lines">@@ -542,11 +542,9 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">         addPtr(TrustedImm32(stackPointerOffsetFor(m_codeBlock) * sizeof(Register)), callFrameRegister, regT1);
</span><del>-        stackCheck = branchPtr(Above, AbsoluteAddress(m_vm-&gt;addressOfJSStackLimit()), regT1);
</del><ins>+        stackOverflow = branchPtr(Above, AbsoluteAddress(m_vm-&gt;addressOfJSStackLimit()), regT1);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    Label functionBody = label();
-
</del><span class="cx">     checkStackPointerAlignment();
</span><span class="cx">     addPtr(TrustedImm32(stackPointerOffsetFor(m_codeBlock) * sizeof(Register)), callFrameRegister, stackPointerRegister);
</span><span class="cx">     checkStackPointerAlignment();
</span><span class="lines">@@ -560,14 +558,9 @@
</span><span class="cx"> 
</span><span class="cx">     Label arityCheck;
</span><span class="cx">     if (m_codeBlock-&gt;codeType() == FunctionCode) {
</span><del>-        stackCheck.link(this);
</del><ins>+        stackOverflow.link(this);
</ins><span class="cx">         m_bytecodeOffset = 0;
</span><del>-        // FIXME: CStack - This may need to have some stack space allocated to make the call
-        callOperationWithCallFrameRollbackOnException(operationStackCheck, m_codeBlock);
-#ifndef NDEBUG
-        m_bytecodeOffset = (unsigned)-1; // Reset this, in order to guard its use with ASSERTs.
-#endif
-        jump(functionBody);
</del><ins>+        callOperationWithCallFrameRollbackOnException(operationThrowStackOverflowError, m_codeBlock);
</ins><span class="cx"> 
</span><span class="cx">         arityCheck = label();
</span><span class="cx">         store8(TrustedImm32(0), &amp;m_codeBlock-&gt;m_shouldAlwaysBeInlined);
</span></span></pre></div>
<a id="branchesjsCStackSourceJavaScriptCorejitJITOperationscpp"></a>
<div class="modfile"><h4>Modified: branches/jsCStack/Source/JavaScriptCore/jit/JITOperations.cpp (160889 => 160890)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsCStack/Source/JavaScriptCore/jit/JITOperations.cpp        2013-12-20 02:01:42 UTC (rev 160889)
+++ branches/jsCStack/Source/JavaScriptCore/jit/JITOperations.cpp        2013-12-20 02:38:00 UTC (rev 160890)
</span><span class="lines">@@ -70,7 +70,7 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-void JIT_OPERATION operationStackCheck(ExecState* exec, CodeBlock* codeBlock)
</del><ins>+void JIT_OPERATION operationThrowStackOverflowError(ExecState* exec, CodeBlock* codeBlock)
</ins><span class="cx"> {
</span><span class="cx">     // We pass in our own code block, because the callframe hasn't been populated.
</span><span class="cx">     VM* vm = codeBlock-&gt;vm();
</span><span class="lines">@@ -79,16 +79,7 @@
</span><span class="cx">         callerFrame = exec;
</span><span class="cx"> 
</span><span class="cx">     NativeCallFrameTracer tracer(vm, callerFrame);
</span><del>-
-#if ENABLE(LLINT_CLOOP)
-    JSStack&amp; stack = vm-&gt;interpreter-&gt;stack();
-
-    if (UNLIKELY(!stack.grow(&amp;exec-&gt;registers()[codeBlock-&gt;stackPointerOffset()])))
-        vm-&gt;throwException(callerFrame, createStackOverflowError(callerFrame));
-#else
-    if (!exec-&gt;vm().isSafeToRecurse(codeBlock-&gt;frameRegisterCount() * sizeof(Register)))
-        vm-&gt;throwException(callerFrame, createStackOverflowError(callerFrame));
-#endif // ENABLE(LLINT_CLOOP)
</del><ins>+    vm-&gt;throwException(callerFrame, createStackOverflowError(callerFrame));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> int32_t JIT_OPERATION operationCallArityCheck(ExecState* exec)
</span></span></pre></div>
<a id="branchesjsCStackSourceJavaScriptCorejitJITOperationsh"></a>
<div class="modfile"><h4>Modified: branches/jsCStack/Source/JavaScriptCore/jit/JITOperations.h (160889 => 160890)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsCStack/Source/JavaScriptCore/jit/JITOperations.h        2013-12-20 02:01:42 UTC (rev 160889)
+++ branches/jsCStack/Source/JavaScriptCore/jit/JITOperations.h        2013-12-20 02:38:00 UTC (rev 160890)
</span><span class="lines">@@ -187,7 +187,7 @@
</span><span class="cx"> void JIT_OPERATION lookupExceptionHandler(ExecState*) WTF_INTERNAL;
</span><span class="cx"> void JIT_OPERATION operationVMHandleException(ExecState*) WTF_INTERNAL;
</span><span class="cx"> 
</span><del>-void JIT_OPERATION operationStackCheck(ExecState*, CodeBlock*) WTF_INTERNAL;
</del><ins>+void JIT_OPERATION operationThrowStackOverflowError(ExecState*, CodeBlock*) WTF_INTERNAL;
</ins><span class="cx"> int32_t JIT_OPERATION operationCallArityCheck(ExecState*) WTF_INTERNAL;
</span><span class="cx"> int32_t JIT_OPERATION operationConstructArityCheck(ExecState*) WTF_INTERNAL;
</span><span class="cx"> EncodedJSValue JIT_OPERATION operationGetById(ExecState*, StructureStubInfo*, EncodedJSValue, StringImpl*) WTF_INTERNAL;
</span></span></pre>
</div>
</div>

</body>
</html>