Diff
Modified: tags/Safari-538.16.2/Source/_javascript_Core/ChangeLog (163492 => 163493)
--- tags/Safari-538.16.2/Source/_javascript_Core/ChangeLog 2014-02-06 00:49:42 UTC (rev 163492)
+++ tags/Safari-538.16.2/Source/_javascript_Core/ChangeLog 2014-02-06 00:52:04 UTC (rev 163493)
@@ -1,5 +1,31 @@
2014-02-05 Lucas Forschler <[email protected]>
+ Merge r163471
+
+ 2014-02-05 Mark Hahnenberg <[email protected]>
+
+ Can no longer run OctaneV2 in browser, crashes in speculationFromCell
+ https://bugs.webkit.org/show_bug.cgi?id=128266
+
+ Reviewed by Filip Pizlo.
+
+ Move the OSR exit write barriers into OSRExitCompilerCommon. Also reorganize some
+ of the code to be in more appropriate places.
+
+ * dfg/DFGOSRExitCompiler32_64.cpp:
+ (JSC::DFG::OSRExitCompiler::compileExit):
+ * dfg/DFGOSRExitCompiler64.cpp:
+ (JSC::DFG::OSRExitCompiler::compileExit):
+ * dfg/DFGOSRExitCompilerCommon.cpp:
+ (JSC::DFG::osrWriteBarrier):
+ (JSC::DFG::adjustAndJumpToTarget):
+ * dfg/DFGSpeculativeJIT.cpp:
+ * dfg/DFGSpeculativeJIT.h:
+ * jit/AssemblyHelpers.h:
+ (JSC::AssemblyHelpers::genericWriteBarrier):
+
+2014-02-05 Lucas Forschler <[email protected]>
+
Merge r163420
2014-02-04 Mark Hahnenberg <[email protected]>
Modified: tags/Safari-538.16.2/Source/_javascript_Core/dfg/DFGOSRExitCompiler32_64.cpp (163492 => 163493)
--- tags/Safari-538.16.2/Source/_javascript_Core/dfg/DFGOSRExitCompiler32_64.cpp 2014-02-06 00:49:42 UTC (rev 163492)
+++ tags/Safari-538.16.2/Source/_javascript_Core/dfg/DFGOSRExitCompiler32_64.cpp 2014-02-06 00:52:04 UTC (rev 163493)
@@ -456,17 +456,6 @@
}
}
-#if ENABLE(GGC)
- // 11) Write barrier the owner executable because we're jumping into a different block.
- for (CodeOrigin codeOrigin = exit.m_codeOrigin; ; codeOrigin = codeOrigin.inlineCallFrame->caller) {
- CodeBlock* baselineCodeBlock = m_jit.baselineCodeBlockFor(codeOrigin);
- m_jit.move(AssemblyHelpers::TrustedImmPtr(baselineCodeBlock->ownerExecutable()), GPRInfo::nonArgGPR0);
- SpeculativeJIT::osrWriteBarrier(m_jit, GPRInfo::nonArgGPR0, GPRInfo::nonArgGPR1, GPRInfo::nonArgGPR2);
- if (!codeOrigin.inlineCallFrame)
- break;
- }
-#endif
-
// 12) And finish.
adjustAndJumpToTarget(m_jit, exit);
}
Modified: tags/Safari-538.16.2/Source/_javascript_Core/dfg/DFGOSRExitCompiler64.cpp (163492 => 163493)
--- tags/Safari-538.16.2/Source/_javascript_Core/dfg/DFGOSRExitCompiler64.cpp 2014-02-06 00:49:42 UTC (rev 163492)
+++ tags/Safari-538.16.2/Source/_javascript_Core/dfg/DFGOSRExitCompiler64.cpp 2014-02-06 00:52:04 UTC (rev 163493)
@@ -412,17 +412,6 @@
}
}
-#if ENABLE(GGC)
- // 11) Write barrier the owner executable because we're jumping into a different block.
- for (CodeOrigin codeOrigin = exit.m_codeOrigin; ; codeOrigin = codeOrigin.inlineCallFrame->caller) {
- CodeBlock* baselineCodeBlock = m_jit.baselineCodeBlockFor(codeOrigin);
- m_jit.move(AssemblyHelpers::TrustedImmPtr(baselineCodeBlock->ownerExecutable()), GPRInfo::nonArgGPR0);
- SpeculativeJIT::osrWriteBarrier(m_jit, GPRInfo::nonArgGPR0, GPRInfo::nonArgGPR1, GPRInfo::nonArgGPR2);
- if (!codeOrigin.inlineCallFrame)
- break;
- }
-#endif
-
// 12) And finish.
adjustAndJumpToTarget(m_jit, exit);
}
Modified: tags/Safari-538.16.2/Source/_javascript_Core/dfg/DFGOSRExitCompilerCommon.cpp (163492 => 163493)
--- tags/Safari-538.16.2/Source/_javascript_Core/dfg/DFGOSRExitCompilerCommon.cpp 2014-02-06 00:49:42 UTC (rev 163492)
+++ tags/Safari-538.16.2/Source/_javascript_Core/dfg/DFGOSRExitCompilerCommon.cpp 2014-02-06 00:52:04 UTC (rev 163493)
@@ -160,8 +160,39 @@
jit.store32(AssemblyHelpers::TrustedImm32(locationBits), AssemblyHelpers::tagFor((VirtualRegister)(JSStack::ArgumentCount)));
}
+static void osrWriteBarrier(CCallHelpers& jit, GPRReg owner, GPRReg scratch1, GPRReg scratch2)
+{
+ AssemblyHelpers::Jump definitelyNotMarked = jit.genericWriteBarrier(owner, scratch1, scratch2);
+
+ // We need these extra slots because setupArgumentsWithExecState will use poke on x86.
+#if CPU(X86)
+ jit.subPtr(MacroAssembler::TrustedImm32(sizeof(void*) * 3), MacroAssembler::stackPointerRegister);
+#endif
+
+ jit.setupArgumentsWithExecState(owner);
+ jit.move(MacroAssembler::TrustedImmPtr(reinterpret_cast<void*>(operationOSRWriteBarrier)), scratch1);
+ jit.call(scratch1);
+
+#if CPU(X86)
+ jit.addPtr(MacroAssembler::TrustedImm32(sizeof(void*) * 3), MacroAssembler::stackPointerRegister);
+#endif
+
+ definitelyNotMarked.link(&jit);
+}
+
void adjustAndJumpToTarget(CCallHelpers& jit, const OSRExitBase& exit)
{
+#if ENABLE(GGC)
+ // 11) Write barrier the owner executable because we're jumping into a different block.
+ for (CodeOrigin codeOrigin = exit.m_codeOrigin; ; codeOrigin = codeOrigin.inlineCallFrame->caller) {
+ CodeBlock* baselineCodeBlock = jit.baselineCodeBlockFor(codeOrigin);
+ jit.move(AssemblyHelpers::TrustedImmPtr(baselineCodeBlock->ownerExecutable()), GPRInfo::nonArgGPR0);
+ osrWriteBarrier(jit, GPRInfo::nonArgGPR0, GPRInfo::nonArgGPR1, GPRInfo::nonArgGPR2);
+ if (!codeOrigin.inlineCallFrame)
+ break;
+ }
+#endif
+
if (exit.m_codeOrigin.inlineCallFrame)
jit.addPtr(AssemblyHelpers::TrustedImm32(exit.m_codeOrigin.inlineCallFrame->stackOffset * sizeof(EncodedJSValue)), GPRInfo::callFrameRegister);
Modified: tags/Safari-538.16.2/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp (163492 => 163493)
--- tags/Safari-538.16.2/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp 2014-02-06 00:49:42 UTC (rev 163492)
+++ tags/Safari-538.16.2/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp 2014-02-06 00:52:04 UTC (rev 163493)
@@ -5518,26 +5518,6 @@
definitelyNotMarked.link(&m_jit);
}
-void SpeculativeJIT::osrWriteBarrier(CCallHelpers& jit, GPRReg owner, GPRReg scratch1, GPRReg scratch2)
-{
- JITCompiler::Jump definitelyNotMarked = genericWriteBarrier(jit, owner, scratch1, scratch2);
-
- // We need these extra slots because setupArgumentsWithExecState will use poke on x86.
-#if CPU(X86)
- jit.subPtr(TrustedImm32(sizeof(void*) * 3), MacroAssembler::stackPointerRegister);
-#endif
-
- jit.setupArgumentsWithExecState(owner);
- jit.move(TrustedImmPtr(reinterpret_cast<void*>(operationOSRWriteBarrier)), scratch1);
- jit.call(scratch1);
-
-#if CPU(X86)
- jit.addPtr(TrustedImm32(sizeof(void*) * 3), MacroAssembler::stackPointerRegister);
-#endif
-
- definitelyNotMarked.link(&jit);
-}
-
void SpeculativeJIT::writeBarrier(GPRReg ownerGPR, GPRReg scratch1, GPRReg scratch2)
{
JITCompiler::Jump definitelyNotMarked = genericWriteBarrier(m_jit, ownerGPR, scratch1, scratch2);
Modified: tags/Safari-538.16.2/Source/_javascript_Core/dfg/DFGSpeculativeJIT.h (163492 => 163493)
--- tags/Safari-538.16.2/Source/_javascript_Core/dfg/DFGSpeculativeJIT.h 2014-02-06 00:49:42 UTC (rev 163492)
+++ tags/Safari-538.16.2/Source/_javascript_Core/dfg/DFGSpeculativeJIT.h 2014-02-06 00:52:04 UTC (rev 163493)
@@ -298,7 +298,6 @@
static JITCompiler::Jump genericWriteBarrier(CCallHelpers& jit, GPRReg owner, GPRReg scratch1, GPRReg scratch2);
static JITCompiler::Jump genericWriteBarrier(CCallHelpers& jit, JSCell* owner);
- static void osrWriteBarrier(CCallHelpers&, GPRReg owner, GPRReg scratch1, GPRReg scratch2);
void writeBarrier(GPRReg owner, GPRReg scratch1, GPRReg scratch2);
void writeBarrier(GPRReg owner, JSCell* value, GPRReg scratch1, GPRReg scratch2);
Modified: tags/Safari-538.16.2/Source/_javascript_Core/jit/AssemblyHelpers.h (163492 => 163493)
--- tags/Safari-538.16.2/Source/_javascript_Core/jit/AssemblyHelpers.h 2014-02-06 00:49:42 UTC (rev 163492)
+++ tags/Safari-538.16.2/Source/_javascript_Core/jit/AssemblyHelpers.h 2014-02-06 00:52:04 UTC (rev 163493)
@@ -389,6 +389,23 @@
void jitAssertArgumentCountSane() { }
#endif
+ Jump genericWriteBarrier(GPRReg owner, GPRReg scratch1, GPRReg scratch2)
+ {
+ move(owner, scratch1);
+ move(owner, scratch2);
+
+ andPtr(TrustedImmPtr(MarkedBlock::blockMask), scratch1);
+ andPtr(TrustedImmPtr(~MarkedBlock::blockMask), scratch2);
+
+#if USE(JSVALUE64)
+ rshift64(TrustedImm32(MarkedBlock::atomShiftAmount + MarkedBlock::markByteShiftAmount), scratch2);
+#else
+ rshift32(TrustedImm32(MarkedBlock::atomShiftAmount + MarkedBlock::markByteShiftAmount), scratch2);
+#endif
+
+ return branchTest8(Zero, BaseIndex(scratch1, scratch2, TimesOne, MarkedBlock::offsetOfMarks()));
+ }
+
// These methods convert between doubles, and doubles boxed and JSValues.
#if USE(JSVALUE64)
GPRReg boxDouble(FPRReg fpr, GPRReg gpr)