<!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>[187301] branches/safari-601.1-branch</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/187301">187301</a></dd>
<dt>Author</dt> <dd>lforschler@apple.com</dd>
<dt>Date</dt> <dd>2015-07-23 23:33:53 -0700 (Thu, 23 Jul 2015)</dd>
</dl>
<h3>Log Message</h3>
<pre>Merged <a href="http://trac.webkit.org/projects/webkit/changeset/187125">r187125</a>. rdar://problem/21847618</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#branchessafari6011branchSourceJavaScriptCoreChangeLog">branches/safari-601.1-branch/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#branchessafari6011branchSourceJavaScriptCoreheapGCLoggingcpp">branches/safari-601.1-branch/Source/JavaScriptCore/heap/GCLogging.cpp</a></li>
<li><a href="#branchessafari6011branchSourceJavaScriptCoreheapGCLoggingh">branches/safari-601.1-branch/Source/JavaScriptCore/heap/GCLogging.h</a></li>
<li><a href="#branchessafari6011branchSourceJavaScriptCorejitExecutableAllocatorh">branches/safari-601.1-branch/Source/JavaScriptCore/jit/ExecutableAllocator.h</a></li>
<li><a href="#branchessafari6011branchSourceJavaScriptCorejitExecutableAllocatorFixedVMPoolcpp">branches/safari-601.1-branch/Source/JavaScriptCore/jit/ExecutableAllocatorFixedVMPool.cpp</a></li>
<li><a href="#branchessafari6011branchSourceJavaScriptCorejsccpp">branches/safari-601.1-branch/Source/JavaScriptCore/jsc.cpp</a></li>
<li><a href="#branchessafari6011branchSourceJavaScriptCoreruntimeOptionscpp">branches/safari-601.1-branch/Source/JavaScriptCore/runtime/Options.cpp</a></li>
<li><a href="#branchessafari6011branchSourceJavaScriptCoreruntimeOptionsh">branches/safari-601.1-branch/Source/JavaScriptCore/runtime/Options.h</a></li>
<li><a href="#branchessafari6011branchToolsChangeLog">branches/safari-601.1-branch/Tools/ChangeLog</a></li>
<li><a href="#branchessafari6011branchToolsScriptsrunjscstresstests">branches/safari-601.1-branch/Tools/Scripts/run-jsc-stress-tests</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="branchessafari6011branchSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: branches/safari-601.1-branch/Source/JavaScriptCore/ChangeLog (187300 => 187301)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-601.1-branch/Source/JavaScriptCore/ChangeLog        2015-07-24 06:31:07 UTC (rev 187300)
+++ branches/safari-601.1-branch/Source/JavaScriptCore/ChangeLog        2015-07-24 06:33:53 UTC (rev 187301)
</span><span class="lines">@@ -1,3 +1,41 @@
</span><ins>+2015-07-23 Lucas Forschler <lforschler@apple.com>
+
+ Merge r187125
+
+ 2015-07-21 Filip Pizlo <fpizlo@apple.com>
+
+ Fixed VM pool allocation should have a reserve for allocations that cannot fail
+ https://bugs.webkit.org/show_bug.cgi?id=147154
+ rdar://problem/21847618
+
+ Reviewed by Geoffrey Garen.
+
+ This adds the notion of a JIT pool reserve fraction. Some fraction, currently 1/4, of
+ the JIT pool is reserved for allocations that cannot fail. It makes sense to make this
+ a fraction rather than a constant because each allocation that can fail may cause some
+ number of allocations that cannot fail (for example, the OSR exit thunks that we
+ compile when we exit from some CodeBlock cannot fail).
+
+ I've tested this by adding a test mode where we artificially limit the JIT pool size.
+ Prior to the fix, we had >20 failures. Now we have none.
+
+ * heap/GCLogging.cpp:
+ (WTF::printInternal): I needed a dump method on Options members when debugging this.
+ * heap/GCLogging.h:
+ * jit/ExecutableAllocator.h: Raise the ARM64 limit to 32MB because 16MB is cutting it too close.
+ * jit/ExecutableAllocatorFixedVMPool.cpp:
+ (JSC::FixedVMPoolExecutableAllocator::FixedVMPoolExecutableAllocator): Add the ability to artificially limit JIT pool size for testing.
+ (JSC::ExecutableAllocator::memoryPressureMultiplier): Implement the reserve when computing memory pressure for JIT tier-up heuristics.
+ (JSC::ExecutableAllocator::allocate): Implement the reserve when allocating can-fail things.
+ * jsc.cpp: Rewire some options parsing so that CommandLine happens before we create the JIT pool.
+ (main):
+ (CommandLine::parseArguments):
+ (jscmain):
+ * runtime/Options.cpp:
+ (JSC::OptionRange::dump): I needed a dump method on Options members when debugging this.
+ (JSC::Options::initialize): This can now be called more than once.
+ * runtime/Options.h:
+
</ins><span class="cx"> 2015-07-20 Matthew Hanson <matthew_hanson@apple.com>
</span><span class="cx">
</span><span class="cx"> Merge r186819. rdar://problem/21729083
</span></span></pre></div>
<a id="branchessafari6011branchSourceJavaScriptCoreheapGCLoggingcpp"></a>
<div class="modfile"><h4>Modified: branches/safari-601.1-branch/Source/JavaScriptCore/heap/GCLogging.cpp (187300 => 187301)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-601.1-branch/Source/JavaScriptCore/heap/GCLogging.cpp        2015-07-24 06:31:07 UTC (rev 187300)
+++ branches/safari-601.1-branch/Source/JavaScriptCore/heap/GCLogging.cpp        2015-07-24 06:33:53 UTC (rev 187301)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2014 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2014, 2015 Apple Inc. All rights reserved.
</ins><span class="cx"> *
</span><span class="cx"> * Redistribution and use in source and binary forms, with or without
</span><span class="cx"> * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> #include "HeapIterationScope.h"
</span><span class="cx"> #include "JSCell.h"
</span><span class="cx"> #include "JSCellInlines.h"
</span><ins>+#include <wtf/PrintStream.h>
</ins><span class="cx">
</span><span class="cx"> namespace JSC {
</span><span class="cx">
</span><span class="lines">@@ -113,3 +114,26 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> } // namespace JSC
</span><ins>+
+namespace WTF {
+
+void printInternal(PrintStream& out, JSC::GCLogging::Level level)
+{
+ switch (level) {
+ case JSC::GCLogging::Level::None:
+ out.print("None");
+ return;
+ case JSC::GCLogging::Level::Basic:
+ out.print("Basic");
+ return;
+ case JSC::GCLogging::Level::Verbose:
+ out.print("Verbose");
+ return;
+ default:
+ out.print("Level=", level - JSC::GCLogging::Level::None);
+ return;
+ }
+}
+
+} // namespace WTF
+
</ins></span></pre></div>
<a id="branchessafari6011branchSourceJavaScriptCoreheapGCLoggingh"></a>
<div class="modfile"><h4>Modified: branches/safari-601.1-branch/Source/JavaScriptCore/heap/GCLogging.h (187300 => 187301)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-601.1-branch/Source/JavaScriptCore/heap/GCLogging.h        2015-07-24 06:31:07 UTC (rev 187300)
+++ branches/safari-601.1-branch/Source/JavaScriptCore/heap/GCLogging.h        2015-07-24 06:33:53 UTC (rev 187301)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2014 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2014, 2015 Apple Inc. All rights reserved.
</ins><span class="cx"> *
</span><span class="cx"> * Redistribution and use in source and binary forms, with or without
</span><span class="cx"> * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -48,4 +48,12 @@
</span><span class="cx">
</span><span class="cx"> } // namespace JSC
</span><span class="cx">
</span><ins>+namespace WTF {
+
+class PrintStream;
+
+void printInternal(PrintStream&, JSC::GCLogging::Level);
+
+} // namespace WTF
+
</ins><span class="cx"> #endif // GCLogging_h
</span></span></pre></div>
<a id="branchessafari6011branchSourceJavaScriptCorejitExecutableAllocatorh"></a>
<div class="modfile"><h4>Modified: branches/safari-601.1-branch/Source/JavaScriptCore/jit/ExecutableAllocator.h (187300 => 187301)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-601.1-branch/Source/JavaScriptCore/jit/ExecutableAllocator.h        2015-07-24 06:31:07 UTC (rev 187300)
+++ branches/safari-601.1-branch/Source/JavaScriptCore/jit/ExecutableAllocator.h        2015-07-24 06:33:53 UTC (rev 187301)
</span><span class="lines">@@ -80,13 +80,16 @@
</span><span class="cx"> #endif
</span><span class="cx">
</span><span class="cx"> #if ENABLE(EXECUTABLE_ALLOCATOR_FIXED)
</span><del>-#if CPU(ARM) || CPU(ARM64)
</del><ins>+#if CPU(ARM)
</ins><span class="cx"> static const size_t fixedExecutableMemoryPoolSize = 16 * 1024 * 1024;
</span><ins>+#elif CPU(ARM64)
+static const size_t fixedExecutableMemoryPoolSize = 32 * 1024 * 1024;
</ins><span class="cx"> #elif CPU(X86_64)
</span><span class="cx"> static const size_t fixedExecutableMemoryPoolSize = 1024 * 1024 * 1024;
</span><span class="cx"> #else
</span><span class="cx"> static const size_t fixedExecutableMemoryPoolSize = 32 * 1024 * 1024;
</span><span class="cx"> #endif
</span><ins>+static const double executablePoolReservationFraction = 0.25;
</ins><span class="cx">
</span><span class="cx"> extern uintptr_t startOfFixedExecutableMemoryPool;
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="branchessafari6011branchSourceJavaScriptCorejitExecutableAllocatorFixedVMPoolcpp"></a>
<div class="modfile"><h4>Modified: branches/safari-601.1-branch/Source/JavaScriptCore/jit/ExecutableAllocatorFixedVMPool.cpp (187300 => 187301)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-601.1-branch/Source/JavaScriptCore/jit/ExecutableAllocatorFixedVMPool.cpp        2015-07-24 06:31:07 UTC (rev 187300)
+++ branches/safari-601.1-branch/Source/JavaScriptCore/jit/ExecutableAllocatorFixedVMPool.cpp        2015-07-24 06:33:53 UTC (rev 187301)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2009 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2009, 2015 Apple Inc. All rights reserved.
</ins><span class="cx"> *
</span><span class="cx"> * Redistribution and use in source and binary forms, with or without
</span><span class="cx"> * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -60,9 +60,14 @@
</span><span class="cx"> FixedVMPoolExecutableAllocator()
</span><span class="cx"> : MetaAllocator(jitAllocationGranule) // round up all allocations to 32 bytes
</span><span class="cx"> {
</span><del>- m_reservation = PageReservation::reserveWithGuardPages(fixedExecutableMemoryPoolSize, OSAllocator::JSJITCodePages, EXECUTABLE_POOL_WRITABLE, true);
</del><ins>+ size_t reservationSize;
+ if (Options::jitMemoryReservationSize())
+ reservationSize = Options::jitMemoryReservationSize();
+ else
+ reservationSize = fixedExecutableMemoryPoolSize;
+ m_reservation = PageReservation::reserveWithGuardPages(reservationSize, OSAllocator::JSJITCodePages, EXECUTABLE_POOL_WRITABLE, true);
</ins><span class="cx"> if (m_reservation) {
</span><del>- ASSERT(m_reservation.size() == fixedExecutableMemoryPoolSize);
</del><ins>+ ASSERT(m_reservation.size() == reservationSize);
</ins><span class="cx"> addFreshFreeSpace(m_reservation.base(), m_reservation.size());
</span><span class="cx">
</span><span class="cx"> startOfFixedExecutableMemoryPool = reinterpret_cast<uintptr_t>(m_reservation.base());
</span><span class="lines">@@ -148,12 +153,14 @@
</span><span class="cx"> MetaAllocator::Statistics statistics = allocator->currentStatistics();
</span><span class="cx"> ASSERT(statistics.bytesAllocated <= statistics.bytesReserved);
</span><span class="cx"> size_t bytesAllocated = statistics.bytesAllocated + addedMemoryUsage;
</span><del>- if (bytesAllocated >= statistics.bytesReserved)
- bytesAllocated = statistics.bytesReserved;
</del><ins>+ size_t bytesAvailable = static_cast<size_t>(
+ statistics.bytesReserved * (1 - executablePoolReservationFraction));
+ if (bytesAllocated >= bytesAvailable)
+ bytesAllocated = bytesAvailable;
</ins><span class="cx"> double result = 1.0;
</span><del>- size_t divisor = statistics.bytesReserved - bytesAllocated;
</del><ins>+ size_t divisor = bytesAvailable - bytesAllocated;
</ins><span class="cx"> if (divisor)
</span><del>- result = static_cast<double>(statistics.bytesReserved) / divisor;
</del><ins>+ result = static_cast<double>(bytesAvailable) / divisor;
</ins><span class="cx"> if (result < 1.0)
</span><span class="cx"> result = 1.0;
</span><span class="cx"> return result;
</span><span class="lines">@@ -170,6 +177,16 @@
</span><span class="cx"> && doExecutableAllocationFuzzingIfEnabled() == PretendToFailExecutableAllocation)
</span><span class="cx"> return nullptr;
</span><span class="cx">
</span><ins>+ if (effort == JITCompilationCanFail) {
+ // Don't allow allocations if we are down to reserve.
+ MetaAllocator::Statistics statistics = allocator->currentStatistics();
+ size_t bytesAllocated = statistics.bytesAllocated + sizeInBytes;
+ size_t bytesAvailable = static_cast<size_t>(
+ statistics.bytesReserved * (1 - executablePoolReservationFraction));
+ if (bytesAllocated > bytesAvailable)
+ return nullptr;
+ }
+
</ins><span class="cx"> RefPtr<ExecutableMemoryHandle> result = allocator->allocate(sizeInBytes, ownerUID);
</span><span class="cx"> if (!result) {
</span><span class="cx"> if (effort != JITCompilationCanFail) {
</span></span></pre></div>
<a id="branchessafari6011branchSourceJavaScriptCorejsccpp"></a>
<div class="modfile"><h4>Modified: branches/safari-601.1-branch/Source/JavaScriptCore/jsc.cpp (187300 => 187301)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-601.1-branch/Source/JavaScriptCore/jsc.cpp        2015-07-24 06:31:07 UTC (rev 187300)
+++ branches/safari-601.1-branch/Source/JavaScriptCore/jsc.cpp        2015-07-24 06:33:53 UTC (rev 187301)
</span><span class="lines">@@ -1247,12 +1247,6 @@
</span><span class="cx"> ecore_init();
</span><span class="cx"> #endif
</span><span class="cx">
</span><del>- // Initialize JSC before getting VM.
-#if ENABLE(SAMPLING_REGIONS)
- WTF::initializeMainThread();
-#endif
- JSC::initializeThreading();
-
</del><span class="cx"> if (char* timeoutString = getenv("JSC_timeout")) {
</span><span class="cx"> if (sscanf(timeoutString, "%lf", &s_desiredTimeout) != 1) {
</span><span class="cx"> dataLog(
</span><span class="lines">@@ -1428,6 +1422,8 @@
</span><span class="cx">
</span><span class="cx"> void CommandLine::parseArguments(int argc, char** argv)
</span><span class="cx"> {
</span><ins>+ Options::initialize();
+
</ins><span class="cx"> int i = 1;
</span><span class="cx"> bool needToDumpOptions = false;
</span><span class="cx"> bool needToExit = false;
</span><span class="lines">@@ -1492,8 +1488,7 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> // See if the -- option is a JSC VM option.
</span><del>- // NOTE: At this point, we know that the arg starts with "--". Skip it.
- if (JSC::Options::setOption(&arg[2])) {
</del><ins>+ if (strstr(arg, "--") == arg && JSC::Options::setOption(&arg[2])) {
</ins><span class="cx"> // The arg was recognized as a VM option and has been parsed.
</span><span class="cx"> continue; // Just continue with the next arg.
</span><span class="cx"> }
</span><span class="lines">@@ -1521,6 +1516,13 @@
</span><span class="cx"> // Note that the options parsing can affect VM creation, and thus
</span><span class="cx"> // comes first.
</span><span class="cx"> CommandLine options(argc, argv);
</span><ins>+
+ // Initialize JSC before getting VM.
+#if ENABLE(SAMPLING_REGIONS)
+ WTF::initializeMainThread();
+#endif
+ JSC::initializeThreading();
+
</ins><span class="cx"> VM* vm = &VM::create(LargeHeap).leakRef();
</span><span class="cx"> int result;
</span><span class="cx"> {
</span></span></pre></div>
<a id="branchessafari6011branchSourceJavaScriptCoreruntimeOptionscpp"></a>
<div class="modfile"><h4>Modified: branches/safari-601.1-branch/Source/JavaScriptCore/runtime/Options.cpp (187300 => 187301)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-601.1-branch/Source/JavaScriptCore/runtime/Options.cpp        2015-07-24 06:31:07 UTC (rev 187300)
+++ branches/safari-601.1-branch/Source/JavaScriptCore/runtime/Options.cpp        2015-07-24 06:33:53 UTC (rev 187301)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> #include <algorithm>
</span><span class="cx"> #include <limits>
</span><span class="cx"> #include <math.h>
</span><ins>+#include <mutex>
</ins><span class="cx"> #include <stdlib.h>
</span><span class="cx"> #include <string.h>
</span><span class="cx"> #include <wtf/DataLog.h>
</span><span class="lines">@@ -201,6 +202,11 @@
</span><span class="cx"> return m_state == Normal ? false : true;
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void OptionRange::dump(PrintStream& out) const
+{
+ out.print(m_rangeString);
+}
+
</ins><span class="cx"> Options::Entry Options::s_options[Options::numberOfOptions];
</span><span class="cx"> Options::Entry Options::s_defaultOptions[Options::numberOfOptions];
</span><span class="cx">
</span><span class="lines">@@ -318,60 +324,66 @@
</span><span class="cx">
</span><span class="cx"> void Options::initialize()
</span><span class="cx"> {
</span><del>- // Initialize each of the options with their default values:
-#define FOR_EACH_OPTION(type_, name_, defaultValue_, description_) \
- name_() = defaultValue_; \
- name_##Default() = defaultValue_;
- JSC_OPTIONS(FOR_EACH_OPTION)
</del><ins>+ static std::once_flag initializeOptionsOnceFlag;
+
+ std::call_once(
+ initializeOptionsOnceFlag,
+ [] {
+ // Initialize each of the options with their default values:
+#define FOR_EACH_OPTION(type_, name_, defaultValue_, description_) \
+ name_() = defaultValue_; \
+ name_##Default() = defaultValue_;
+ JSC_OPTIONS(FOR_EACH_OPTION)
</ins><span class="cx"> #undef FOR_EACH_OPTION
</span><span class="cx">
</span><del>- // It *probably* makes sense for other platforms to enable this.
</del><ins>+ // It *probably* makes sense for other platforms to enable this.
</ins><span class="cx"> #if PLATFORM(IOS) && CPU(ARM64)
</span><del>- enableLLVMFastISel() = true;
</del><ins>+ enableLLVMFastISel() = true;
</ins><span class="cx"> #endif
</span><span class="cx">
</span><del>- // Allow environment vars to override options if applicable.
- // The evn var should be the name of the option prefixed with
- // "JSC_".
-#define FOR_EACH_OPTION(type_, name_, defaultValue_, description_) \
- overrideOptionWithHeuristic(name_(), "JSC_" #name_);
- JSC_OPTIONS(FOR_EACH_OPTION)
</del><ins>+ // Allow environment vars to override options if applicable.
+ // The evn var should be the name of the option prefixed with
+ // "JSC_".
+#define FOR_EACH_OPTION(type_, name_, defaultValue_, description_) \
+ overrideOptionWithHeuristic(name_(), "JSC_" #name_);
+ JSC_OPTIONS(FOR_EACH_OPTION)
</ins><span class="cx"> #undef FOR_EACH_OPTION
</span><span class="cx">
</span><span class="cx"> #if 0
</span><del>- ; // Deconfuse editors that do auto indentation
</del><ins>+ ; // Deconfuse editors that do auto indentation
</ins><span class="cx"> #endif
</span><span class="cx">
</span><del>- recomputeDependentOptions();
</del><ins>+ recomputeDependentOptions();
</ins><span class="cx">
</span><del>- // Do range checks where needed and make corrections to the options:
- ASSERT(Options::thresholdForOptimizeAfterLongWarmUp() >= Options::thresholdForOptimizeAfterWarmUp());
- ASSERT(Options::thresholdForOptimizeAfterWarmUp() >= Options::thresholdForOptimizeSoon());
- ASSERT(Options::thresholdForOptimizeAfterWarmUp() >= 0);
</del><ins>+ // Do range checks where needed and make corrections to the options:
+ ASSERT(Options::thresholdForOptimizeAfterLongWarmUp() >= Options::thresholdForOptimizeAfterWarmUp());
+ ASSERT(Options::thresholdForOptimizeAfterWarmUp() >= Options::thresholdForOptimizeSoon());
+ ASSERT(Options::thresholdForOptimizeAfterWarmUp() >= 0);
</ins><span class="cx">
</span><del>- if (Options::showOptions()) {
- DumpLevel level = static_cast<DumpLevel>(Options::showOptions());
- if (level > DumpLevel::Verbose)
- level = DumpLevel::Verbose;
</del><ins>+ if (Options::showOptions()) {
+ DumpLevel level = static_cast<DumpLevel>(Options::showOptions());
+ if (level > DumpLevel::Verbose)
+ level = DumpLevel::Verbose;
</ins><span class="cx">
</span><del>- const char* title = nullptr;
- switch (level) {
- case DumpLevel::None:
- break;
- case DumpLevel::Overridden:
- title = "Overridden JSC options:";
- break;
- case DumpLevel::All:
- title = "All JSC options:";
- break;
- case DumpLevel::Verbose:
- title = "All JSC options with descriptions:";
- break;
- }
- dumpAllOptions(level, title);
- }
</del><ins>+ const char* title = nullptr;
+ switch (level) {
+ case DumpLevel::None:
+ break;
+ case DumpLevel::Overridden:
+ title = "Overridden JSC options:";
+ break;
+ case DumpLevel::All:
+ title = "All JSC options:";
+ break;
+ case DumpLevel::Verbose:
+ title = "All JSC options with descriptions:";
+ break;
+ }
+ dumpAllOptions(level, title);
+ }
</ins><span class="cx">
</span><del>- ensureOptionsAreCoherent();
</del><ins>+ ensureOptionsAreCoherent();
+ });
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> // Parses a single command line option in the format "<optionName>=<value>"
</span></span></pre></div>
<a id="branchessafari6011branchSourceJavaScriptCoreruntimeOptionsh"></a>
<div class="modfile"><h4>Modified: branches/safari-601.1-branch/Source/JavaScriptCore/runtime/Options.h (187300 => 187301)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-601.1-branch/Source/JavaScriptCore/runtime/Options.h        2015-07-24 06:31:07 UTC (rev 187300)
+++ branches/safari-601.1-branch/Source/JavaScriptCore/runtime/Options.h        2015-07-24 06:33:53 UTC (rev 187301)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> #include "JSExportMacros.h"
</span><span class="cx"> #include <stdint.h>
</span><span class="cx"> #include <stdio.h>
</span><ins>+#include <wtf/PrintStream.h>
</ins><span class="cx"> #include <wtf/StdLibExtras.h>
</span><span class="cx">
</span><span class="cx"> namespace JSC {
</span><span class="lines">@@ -80,6 +81,8 @@
</span><span class="cx"> bool init(const char*);
</span><span class="cx"> bool isInRange(unsigned);
</span><span class="cx"> const char* rangeString() const { return (m_state > InitError) ? m_rangeString : "<null>"; }
</span><ins>+
+ void dump(PrintStream& out) const;
</ins><span class="cx">
</span><span class="cx"> private:
</span><span class="cx"> RangeState m_state;
</span><span class="lines">@@ -106,6 +109,7 @@
</span><span class="cx"> v(unsigned, errorModeReservedZoneSize, 64 * KB, nullptr) \
</span><span class="cx"> \
</span><span class="cx"> v(bool, crashIfCantAllocateJITMemory, false, nullptr) \
</span><ins>+ v(unsigned, jitMemoryReservationSize, 0, nullptr) \
</ins><span class="cx"> \
</span><span class="cx"> v(bool, forceDFGCodeBlockLiveness, false, nullptr) \
</span><span class="cx"> v(bool, forceICFailure, false, nullptr) \
</span><span class="lines">@@ -349,7 +353,7 @@
</span><span class="cx"> gcLogLevelType,
</span><span class="cx"> };
</span><span class="cx">
</span><del>- static void initialize();
</del><ins>+ JS_EXPORT_PRIVATE static void initialize();
</ins><span class="cx">
</span><span class="cx"> // Parses a single command line option in the format "<optionName>=<value>"
</span><span class="cx"> // (no spaces allowed) and set the specified option if appropriate.
</span></span></pre></div>
<a id="branchessafari6011branchToolsChangeLog"></a>
<div class="modfile"><h4>Modified: branches/safari-601.1-branch/Tools/ChangeLog (187300 => 187301)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-601.1-branch/Tools/ChangeLog        2015-07-24 06:31:07 UTC (rev 187300)
+++ branches/safari-601.1-branch/Tools/ChangeLog        2015-07-24 06:33:53 UTC (rev 187301)
</span><span class="lines">@@ -1,3 +1,20 @@
</span><ins>+2015-07-23 Lucas Forschler <lforschler@apple.com>
+
+ Merge r187125
+
+ 2015-07-21 Filip Pizlo <fpizlo@apple.com>
+
+ Fixed VM pool allocation should have a reserve for allocations that cannot fail
+ https://bugs.webkit.org/show_bug.cgi?id=147154
+ rdar://problem/21847618
+
+ Reviewed by Geoffrey Garen.
+
+ Add a new test mode where we artificially limit JIT memory to 50KB. If our JIT OOM
+ mitigations work, these should all pass. Prior to this patch there were >20 failures.
+
+ * Scripts/run-jsc-stress-tests:
+
</ins><span class="cx"> 2015-07-20 Matthew Hanson <matthew_hanson@apple.com>
</span><span class="cx">
</span><span class="cx"> Merge r186910. rdar://problem/21863296
</span></span></pre></div>
<a id="branchessafari6011branchToolsScriptsrunjscstresstests"></a>
<div class="modfile"><h4>Modified: branches/safari-601.1-branch/Tools/Scripts/run-jsc-stress-tests (187300 => 187301)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-601.1-branch/Tools/Scripts/run-jsc-stress-tests        2015-07-24 06:31:07 UTC (rev 187300)
+++ branches/safari-601.1-branch/Tools/Scripts/run-jsc-stress-tests        2015-07-24 06:33:53 UTC (rev 187301)
</span><span class="lines">@@ -758,6 +758,10 @@
</span><span class="cx"> run("ftl-no-cjit-no-access-inlining", "--enableAccessInlining=false", *(FTL_OPTIONS + NO_CJIT_OPTIONS)) if $enableFTL
</span><span class="cx"> end
</span><span class="cx">
</span><ins>+def runFTLNoCJITSmallPool
+ run("ftl-no-cjit-small-pool", "--jitMemoryReservationSize=50000", *(FTL_OPTIONS + NO_CJIT_OPTIONS)) if $enableFTL
+end
+
</ins><span class="cx"> def defaultRun
</span><span class="cx"> runDefault
</span><span class="cx"> runAlwaysTriggerCopyPhase
</span><span class="lines">@@ -771,6 +775,7 @@
</span><span class="cx"> runFTLNoCJITNoInlineValidate
</span><span class="cx"> runFTLEager
</span><span class="cx"> runFTLEagerNoCJITValidate
</span><ins>+ runFTLNoCJITSmallPool
</ins><span class="cx"> end
</span><span class="cx"> end
</span><span class="cx">
</span></span></pre>
</div>
</div>
</body>
</html>