<!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>[173370] trunk/Source</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/173370">173370</a></dd>
<dt>Author</dt> <dd>mjs@apple.com</dd>
<dt>Date</dt> <dd>2014-09-07 19:16:47 -0700 (Sun, 07 Sep 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Introduce COMPILER_QUIRK(CONSIDERS_UNREACHABLE_CODE) and use it
https://bugs.webkit.org/show_bug.cgi?id=136616

Reviewed by Darin Adler.
Source/JavaScriptCore:

        
Many compilers will analyze unrechable code paths (e.g. after an
unreachable code path), so sometimes they need dead code initializations.
But clang with suitable warnings will complain about unreachable code. So
use the quirk to include it conditionally.

* bytecode/CodeBlock.cpp:
(JSC::CodeBlock::printGetByIdOp):
* dfg/DFGOSRExitCompilerCommon.cpp:
(JSC::DFG::handleExitCounts):
* dfg/DFGPlan.cpp:
(JSC::DFG::Plan::compileInThread):
* dfg/DFGSpeculativeJIT.cpp:
(JSC::DFG::SpeculativeJIT::silentSavePlanForGPR):
* jsc.cpp:
* runtime/JSArray.cpp:
(JSC::JSArray::fillArgList):
(JSC::JSArray::copyToArguments):
* runtime/RegExp.cpp:
(JSC::RegExp::compile):
(JSC::RegExp::compileMatchOnly):

Source/WTF:


* wtf/Compiler.h: Define the quirk for all compilers but clang.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeCodeBlockcpp">trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGOSRExitCompilerCommoncpp">trunk/Source/JavaScriptCore/dfg/DFGOSRExitCompilerCommon.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGPlancpp">trunk/Source/JavaScriptCore/dfg/DFGPlan.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGSpeculativeJITcpp">trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorejsccpp">trunk/Source/JavaScriptCore/jsc.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSArraycpp">trunk/Source/JavaScriptCore/runtime/JSArray.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeRegExpcpp">trunk/Source/JavaScriptCore/runtime/RegExp.cpp</a></li>
<li><a href="#trunkSourceWTFChangeLog">trunk/Source/WTF/ChangeLog</a></li>
<li><a href="#trunkSourceWTFwtfCompilerh">trunk/Source/WTF/wtf/Compiler.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (173369 => 173370)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2014-09-08 01:36:07 UTC (rev 173369)
+++ trunk/Source/JavaScriptCore/ChangeLog        2014-09-08 02:16:47 UTC (rev 173370)
</span><span class="lines">@@ -1,3 +1,31 @@
</span><ins>+2014-09-07  Maciej Stachowiak  &lt;mjs@apple.com&gt;
+
+        Introduce COMPILER_QUIRK(CONSIDERS_UNREACHABLE_CODE) and use it
+        https://bugs.webkit.org/show_bug.cgi?id=136616
+
+        Reviewed by Darin Adler.
+        
+        Many compilers will analyze unrechable code paths (e.g. after an
+        unreachable code path), so sometimes they need dead code initializations.
+        But clang with suitable warnings will complain about unreachable code. So
+        use the quirk to include it conditionally.
+
+        * bytecode/CodeBlock.cpp:
+        (JSC::CodeBlock::printGetByIdOp):
+        * dfg/DFGOSRExitCompilerCommon.cpp:
+        (JSC::DFG::handleExitCounts):
+        * dfg/DFGPlan.cpp:
+        (JSC::DFG::Plan::compileInThread):
+        * dfg/DFGSpeculativeJIT.cpp:
+        (JSC::DFG::SpeculativeJIT::silentSavePlanForGPR):
+        * jsc.cpp:
+        * runtime/JSArray.cpp:
+        (JSC::JSArray::fillArgList):
+        (JSC::JSArray::copyToArguments):
+        * runtime/RegExp.cpp:
+        (JSC::RegExp::compile):
+        (JSC::RegExp::compileMatchOnly):
+
</ins><span class="cx"> 2014-09-06  Darin Adler  &lt;darin@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Make updates suggested by new version of Xcode
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeCodeBlockcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp (173369 => 173370)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp        2014-09-08 01:36:07 UTC (rev 173369)
+++ trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp        2014-09-08 02:16:47 UTC (rev 173370)
</span><span class="lines">@@ -279,7 +279,9 @@
</span><span class="cx">         break;
</span><span class="cx">     default:
</span><span class="cx">         RELEASE_ASSERT_NOT_REACHED();
</span><ins>+#if COMPILER_QUIRK(CONSIDERS_UNREACHABLE_CODE)
</ins><span class="cx">         op = 0;
</span><ins>+#endif
</ins><span class="cx">     }
</span><span class="cx">     int r0 = (++it)-&gt;u.operand;
</span><span class="cx">     int r1 = (++it)-&gt;u.operand;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGOSRExitCompilerCommoncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGOSRExitCompilerCommon.cpp (173369 => 173370)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGOSRExitCompilerCommon.cpp        2014-09-08 01:36:07 UTC (rev 173369)
+++ trunk/Source/JavaScriptCore/dfg/DFGOSRExitCompilerCommon.cpp        2014-09-08 02:16:47 UTC (rev 173370)
</span><span class="lines">@@ -123,7 +123,9 @@
</span><span class="cx">         break;
</span><span class="cx">     default:
</span><span class="cx">         RELEASE_ASSERT_NOT_REACHED();
</span><ins>+#if COMPILER_QUIRK(CONSIDERS_UNREACHABLE_CODE)
</ins><span class="cx">         clippedValue = 0; // Make some compilers, and mhahnenberg, happy.
</span><ins>+#endif
</ins><span class="cx">         break;
</span><span class="cx">     }
</span><span class="cx">     jit.store32(AssemblyHelpers::TrustedImm32(-clippedValue), AssemblyHelpers::Address(GPRInfo::regT0, CodeBlock::offsetOfJITExecuteCounter()));
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGPlancpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGPlan.cpp (173369 => 173370)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGPlan.cpp        2014-09-08 01:36:07 UTC (rev 173369)
+++ trunk/Source/JavaScriptCore/dfg/DFGPlan.cpp        2014-09-08 02:16:47 UTC (rev 173370)
</span><span class="lines">@@ -181,7 +181,9 @@
</span><span class="cx">             break;
</span><span class="cx">         default:
</span><span class="cx">             RELEASE_ASSERT_NOT_REACHED();
</span><ins>+#if COMPILER_QUIRK(CONSIDERS_UNREACHABLE_CODE)
</ins><span class="cx">             pathName = &quot;&quot;;
</span><ins>+#endif
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         double now = currentTimeMS();
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGSpeculativeJITcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp (173369 => 173370)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp        2014-09-08 01:36:07 UTC (rev 173369)
+++ trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp        2014-09-08 02:16:47 UTC (rev 173370)
</span><span class="lines">@@ -331,7 +331,9 @@
</span><span class="cx">     } else if (registerFormat == DataFormatBoolean) {
</span><span class="cx"> #if USE(JSVALUE64)
</span><span class="cx">         RELEASE_ASSERT_NOT_REACHED();
</span><ins>+#if COMPILER_QUIRK(CONSIDERS_UNREACHABLE_CODE)
</ins><span class="cx">         fillAction = DoNothingForFill;
</span><ins>+#endif
</ins><span class="cx"> #elif USE(JSVALUE32_64)
</span><span class="cx">         ASSERT(info.gpr() == source);
</span><span class="cx">         if (node-&gt;hasConstant()) {
</span><span class="lines">@@ -367,7 +369,9 @@
</span><span class="cx">             fillAction = Load64;
</span><span class="cx">         else {
</span><span class="cx">             RELEASE_ASSERT_NOT_REACHED();
</span><ins>+#if COMPILER_QUIRK(CONSIDERS_UNREACHABLE_CODE)
</ins><span class="cx">             fillAction = Load64; // Make GCC happy.
</span><ins>+#endif
</ins><span class="cx">         }
</span><span class="cx">     } else if (registerFormat == DataFormatStrictInt52) {
</span><span class="cx">         if (node-&gt;hasConstant())
</span><span class="lines">@@ -380,7 +384,9 @@
</span><span class="cx">             fillAction = Load64;
</span><span class="cx">         else {
</span><span class="cx">             RELEASE_ASSERT_NOT_REACHED();
</span><ins>+#if COMPILER_QURIK(CONSIDERS_UNREACHABLE_CODE)
</ins><span class="cx">             fillAction = Load64; // Make GCC happy.
</span><ins>+#endif
</ins><span class="cx">         }
</span><span class="cx">     } else {
</span><span class="cx">         ASSERT(registerFormat &amp; DataFormatJS);
</span><span class="lines">@@ -596,7 +602,7 @@
</span><span class="cx">     switch (arrayMode.arrayClass()) {
</span><span class="cx">     case Array::OriginalArray: {
</span><span class="cx">         CRASH();
</span><del>-#if !COMPILER(CLANG)
</del><ins>+#if COMPILER_QURIK(CONSIDERS_UNREACHABLE_CODE)
</ins><span class="cx">         JITCompiler::Jump result; // I already know that VC++ takes unkindly to the expression &quot;return Jump()&quot;, so I'm doing it this way in anticipation of someone eventually using VC++ to compile the DFG.
</span><span class="cx">         return result;
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejsccpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jsc.cpp (173369 => 173370)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jsc.cpp        2014-09-08 01:36:07 UTC (rev 173369)
+++ trunk/Source/JavaScriptCore/jsc.cpp        2014-09-08 02:16:47 UTC (rev 173370)
</span><span class="lines">@@ -363,7 +363,7 @@
</span><span class="cx">     static NO_RETURN_DUE_TO_CRASH bool deleteProperty(JSCell*, ExecState*, PropertyName)
</span><span class="cx">     {
</span><span class="cx">         RELEASE_ASSERT_NOT_REACHED();
</span><del>-#if !COMPILER(CLANG) &amp;&amp; !COMPILER(MSVC)
</del><ins>+#if COMPILER_QUIRK(CONSIDERS_UNREACHABLE_CODE)
</ins><span class="cx">         return true;
</span><span class="cx"> #endif
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSArraycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSArray.cpp (173369 => 173370)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSArray.cpp        2014-09-08 01:36:07 UTC (rev 173369)
+++ trunk/Source/JavaScriptCore/runtime/JSArray.cpp        2014-09-08 02:16:47 UTC (rev 173370)
</span><span class="lines">@@ -1553,7 +1553,7 @@
</span><span class="cx">         
</span><span class="cx">     default:
</span><span class="cx">         CRASH();
</span><del>-#if !COMPILER(CLANG)
</del><ins>+#if COMPILER_QUIRK(CONSIDERS_UNREACHABLE_CODE)
</ins><span class="cx">         vector = 0;
</span><span class="cx">         vectorEnd = 0;
</span><span class="cx">         break;
</span><span class="lines">@@ -1617,7 +1617,7 @@
</span><span class="cx">         
</span><span class="cx">     default:
</span><span class="cx">         CRASH();
</span><del>-#if !COMPILER(CLANG)
</del><ins>+#if COMPILER_QUIRK(CONSIDERS_UNREACHABLE_CODE)
</ins><span class="cx">         vector = 0;
</span><span class="cx">         vectorEnd = 0;
</span><span class="cx">         break;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeRegExpcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/RegExp.cpp (173369 => 173370)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/RegExp.cpp        2014-09-08 01:36:07 UTC (rev 173369)
+++ trunk/Source/JavaScriptCore/runtime/RegExp.cpp        2014-09-08 02:16:47 UTC (rev 173370)
</span><span class="lines">@@ -273,8 +273,10 @@
</span><span class="cx">     Yarr::YarrPattern pattern(m_patternString, ignoreCase(), multiline(), &amp;m_constructionError);
</span><span class="cx">     if (m_constructionError) {
</span><span class="cx">         RELEASE_ASSERT_NOT_REACHED();
</span><ins>+#if COMPILER_QUIRK(CONSIDERS_UNREACHABLE_CODE)
</ins><span class="cx">         m_state = ParseError;
</span><span class="cx">         return;
</span><ins>+#endif
</ins><span class="cx">     }
</span><span class="cx">     ASSERT(m_numSubpatterns == pattern.m_numSubpatterns);
</span><span class="cx"> 
</span><span class="lines">@@ -396,8 +398,10 @@
</span><span class="cx">     Yarr::YarrPattern pattern(m_patternString, ignoreCase(), multiline(), &amp;m_constructionError);
</span><span class="cx">     if (m_constructionError) {
</span><span class="cx">         RELEASE_ASSERT_NOT_REACHED();
</span><ins>+#if COMPILER_QUIRK(CONSIDERS_UNREACHABLE_CODE)
</ins><span class="cx">         m_state = ParseError;
</span><span class="cx">         return;
</span><ins>+#endif
</ins><span class="cx">     }
</span><span class="cx">     ASSERT(m_numSubpatterns == pattern.m_numSubpatterns);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWTFChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/ChangeLog (173369 => 173370)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/ChangeLog        2014-09-08 01:36:07 UTC (rev 173369)
+++ trunk/Source/WTF/ChangeLog        2014-09-08 02:16:47 UTC (rev 173370)
</span><span class="lines">@@ -1,3 +1,12 @@
</span><ins>+2014-09-07  Maciej Stachowiak  &lt;mjs@apple.com&gt;
+
+        Introduce COMPILER_QUIRK(CONSIDERS_UNREACHABLE_CODE) and use it
+        https://bugs.webkit.org/show_bug.cgi?id=136616
+
+        Reviewed by Darin Adler.
+
+        * wtf/Compiler.h: Define the quirk for all compilers but clang.
+
</ins><span class="cx"> 2014-09-06  Sam Weinig  &lt;sam@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         XPCPtr should be converted into an all purpose smart pointer for os_objects
</span></span></pre></div>
<a id="trunkSourceWTFwtfCompilerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/Compiler.h (173369 => 173370)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/Compiler.h        2014-09-08 01:36:07 UTC (rev 173369)
+++ trunk/Source/WTF/wtf/Compiler.h        2014-09-08 02:16:47 UTC (rev 173370)
</span><span class="lines">@@ -74,6 +74,10 @@
</span><span class="cx"> #define WTF_COMPILER_SUPPORTS_CXX_USER_LITERALS 1
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+#if !COMPILER(CLANG)
+#define WTF_COMPILER_QUIRK_CONSIDERS_UNREACHABLE_CODE 1
+#endif
+
</ins><span class="cx"> #if COMPILER(GCC) &amp;&amp; !COMPILER(CLANG) &amp;&amp; defined(__STDC_VERSION__) &amp;&amp; __STDC_VERSION__ &gt;= 201112L
</span><span class="cx"> #define WTF_COMPILER_SUPPORTS_C_STATIC_ASSERT 1
</span><span class="cx"> #endif
</span></span></pre>
</div>
</div>

</body>
</html>