WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
Patch
bug-129760-20140305193138.patch (text/plain), 10.16 KB, created by
Mark Hahnenberg
on 2014-03-05 19:31:40 PST
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Mark Hahnenberg
Created:
2014-03-05 19:31:40 PST
Size:
10.16 KB
patch
obsolete
>Index: Source/JavaScriptCore/ChangeLog >=================================================================== >--- Source/JavaScriptCore/ChangeLog (revision 165166) >+++ Source/JavaScriptCore/ChangeLog (working copy) >@@ -1,3 +1,27 @@ >+2014-03-05 Mark Hahnenberg <mhahnenberg@apple.com> >+ >+ Fix write barriers in Repatch.cpp for !ENABLE(DFG_JIT) platforms after r165128 >+ https://bugs.webkit.org/show_bug.cgi?id=129760 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ r165128 disabled the write barrier fast path for inline caches on !ENABLE(DFG_JIT) platforms. >+ The fix is to refactor the write barrier code into AssemblyHelpers and use that everywhere. >+ >+ * dfg/DFGSpeculativeJIT.cpp: >+ (JSC::DFG::SpeculativeJIT::writeBarrier): >+ * dfg/DFGSpeculativeJIT.h: >+ * dfg/DFGSpeculativeJIT32_64.cpp: >+ (JSC::DFG::SpeculativeJIT::writeBarrier): >+ * dfg/DFGSpeculativeJIT64.cpp: >+ (JSC::DFG::SpeculativeJIT::writeBarrier): >+ * jit/AssemblyHelpers.h: >+ (JSC::AssemblyHelpers::checkMarkByte): >+ * jit/JIT.h: >+ * jit/JITPropertyAccess.cpp: >+ * jit/Repatch.cpp: >+ (JSC::writeBarrier): >+ > 2014-03-05 Joseph Pecoraro <pecoraro@apple.com> > > Web Inspector: Prevent possible deadlock in view indication >Index: Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp >=================================================================== >--- Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp (revision 165160) >+++ Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp (working copy) >@@ -4726,7 +4726,7 @@ void SpeculativeJIT::writeBarrier(GPRReg > if (!isKnownCell(valueUse.node())) > isNotCell = m_jit.branch32(JITCompiler::NotEqual, valueTagGPR, JITCompiler::TrustedImm32(JSValue::CellTag)); > >- JITCompiler::Jump ownerNotMarkedOrAlreadyRemembered = checkMarkByte(m_jit, ownerGPR); >+ JITCompiler::Jump ownerNotMarkedOrAlreadyRemembered = m_jit.checkMarkByte(ownerGPR); > storeToWriteBarrierBuffer(ownerGPR, scratch1, scratch2); > ownerNotMarkedOrAlreadyRemembered.link(&m_jit); > >@@ -4740,7 +4740,7 @@ void SpeculativeJIT::writeBarrier(JSCell > if (!isKnownCell(valueUse.node())) > isNotCell = m_jit.branch32(JITCompiler::NotEqual, valueTagGPR, JITCompiler::TrustedImm32(JSValue::CellTag)); > >- JITCompiler::Jump ownerNotMarkedOrAlreadyRemembered = checkMarkByte(m_jit, owner); >+ JITCompiler::Jump ownerNotMarkedOrAlreadyRemembered = m_jit.checkMarkByte(owner); > storeToWriteBarrierBuffer(owner, scratch1, scratch2); > ownerNotMarkedOrAlreadyRemembered.link(&m_jit); > >Index: Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp >=================================================================== >--- Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp (revision 165160) >+++ Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp (working copy) >@@ -5060,7 +5060,7 @@ void SpeculativeJIT::writeBarrier(GPRReg > if (!isKnownCell(valueUse.node())) > isNotCell = m_jit.branchTest64(JITCompiler::NonZero, valueGPR, GPRInfo::tagMaskRegister); > >- JITCompiler::Jump ownerNotMarkedOrAlreadyRemembered = checkMarkByte(m_jit, ownerGPR); >+ JITCompiler::Jump ownerNotMarkedOrAlreadyRemembered = m_jit.checkMarkByte(ownerGPR); > storeToWriteBarrierBuffer(ownerGPR, scratch1, scratch2); > ownerNotMarkedOrAlreadyRemembered.link(&m_jit); > >@@ -5074,7 +5074,7 @@ void SpeculativeJIT::writeBarrier(JSCell > if (!isKnownCell(valueUse.node())) > isNotCell = m_jit.branchTest64(JITCompiler::NonZero, valueGPR, GPRInfo::tagMaskRegister); > >- JITCompiler::Jump ownerNotMarkedOrAlreadyRemembered = checkMarkByte(m_jit, owner); >+ JITCompiler::Jump ownerNotMarkedOrAlreadyRemembered = m_jit.checkMarkByte(owner); > storeToWriteBarrierBuffer(owner, scratch1, scratch2); > ownerNotMarkedOrAlreadyRemembered.link(&m_jit); > >Index: Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp >=================================================================== >--- Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp (revision 165160) >+++ Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp (working copy) >@@ -5469,17 +5469,6 @@ void SpeculativeJIT::compileStoreBarrier > noResult(node); > } > >-JITCompiler::Jump SpeculativeJIT::checkMarkByte(CCallHelpers& jit, GPRReg owner) >-{ >- return jit.branchTest8(MacroAssembler::NonZero, MacroAssembler::Address(owner, JSCell::gcDataOffset())); >-} >- >-JITCompiler::Jump SpeculativeJIT::checkMarkByte(CCallHelpers& jit, JSCell* owner) >-{ >- uint8_t* address = reinterpret_cast<uint8_t*>(owner) + JSCell::gcDataOffset(); >- return jit.branchTest8(MacroAssembler::NonZero, MacroAssembler::AbsoluteAddress(address)); >-} >- > void SpeculativeJIT::storeToWriteBarrierBuffer(GPRReg cell, GPRReg scratch1, GPRReg scratch2) > { > ASSERT(scratch1 != scratch2); >@@ -5536,14 +5525,14 @@ void SpeculativeJIT::writeBarrier(GPRReg > if (Heap::isMarked(value)) > return; > >- JITCompiler::Jump ownerNotMarkedOrAlreadyRemembered = checkMarkByte(m_jit, ownerGPR); >+ JITCompiler::Jump ownerNotMarkedOrAlreadyRemembered = m_jit.checkMarkByte(ownerGPR); > storeToWriteBarrierBuffer(ownerGPR, scratch1, scratch2); > ownerNotMarkedOrAlreadyRemembered.link(&m_jit); > } > > void SpeculativeJIT::writeBarrier(GPRReg ownerGPR, GPRReg scratch1, GPRReg scratch2) > { >- JITCompiler::Jump ownerNotMarkedOrAlreadyRemembered = checkMarkByte(m_jit, ownerGPR); >+ JITCompiler::Jump ownerNotMarkedOrAlreadyRemembered = m_jit.checkMarkByte(ownerGPR); > storeToWriteBarrierBuffer(ownerGPR, scratch1, scratch2); > ownerNotMarkedOrAlreadyRemembered.link(&m_jit); > } >Index: Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h >=================================================================== >--- Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h (revision 165160) >+++ Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h (working copy) >@@ -296,8 +296,6 @@ public: > void storeToWriteBarrierBuffer(GPRReg cell, GPRReg scratch1, GPRReg scratch2); > void storeToWriteBarrierBuffer(JSCell*, GPRReg scratch1, GPRReg scratch2); > >- static JITCompiler::Jump checkMarkByte(CCallHelpers& jit, GPRReg owner); >- static JITCompiler::Jump checkMarkByte(CCallHelpers& jit, JSCell* owner); > void writeBarrier(GPRReg owner, GPRReg scratch1, GPRReg scratch2); > void writeBarrier(GPRReg owner, JSCell* value, GPRReg scratch1, GPRReg scratch2); > >Index: Source/JavaScriptCore/jit/AssemblyHelpers.h >=================================================================== >--- Source/JavaScriptCore/jit/AssemblyHelpers.h (revision 165160) >+++ Source/JavaScriptCore/jit/AssemblyHelpers.h (working copy) >@@ -387,11 +387,6 @@ public: > void jitAssertArgumentCountSane() { } > #endif > >- Jump checkMarkByte(GPRReg owner) >- { >- return branchTest8(NonZero, Address(owner, JSCell::gcDataOffset())); >- } >- > // These methods convert between doubles, and doubles boxed and JSValues. > #if USE(JSVALUE64) > GPRReg boxDouble(FPRReg fpr, GPRReg gpr) >@@ -620,19 +615,15 @@ public: > #endif > } > >- void writeBarrier(GPRReg owner, GPRReg scratch1, GPRReg scratch2, WriteBarrierUseKind useKind) >+ Jump checkMarkByte(GPRReg cell) > { >- UNUSED_PARAM(owner); >- UNUSED_PARAM(scratch1); >- UNUSED_PARAM(scratch2); >- UNUSED_PARAM(useKind); >- ASSERT(owner != scratch1); >- ASSERT(owner != scratch2); >- ASSERT(scratch1 != scratch2); >- >-#if ENABLE(WRITE_BARRIER_PROFILING) >- emitCount(WriteBarrierCounters::jitCounterFor(useKind)); >-#endif >+ return branchTest8(MacroAssembler::NonZero, MacroAssembler::Address(cell, JSCell::gcDataOffset())); >+ } >+ >+ Jump checkMarkByte(JSCell* cell) >+ { >+ uint8_t* address = reinterpret_cast<uint8_t*>(cell) + JSCell::gcDataOffset(); >+ return branchTest8(MacroAssembler::NonZero, MacroAssembler::AbsoluteAddress(address)); > } > > Vector<BytecodeAndMachineOffset>& decodedCodeMapFor(CodeBlock*); >Index: Source/JavaScriptCore/jit/JIT.h >=================================================================== >--- Source/JavaScriptCore/jit/JIT.h (revision 165160) >+++ Source/JavaScriptCore/jit/JIT.h (working copy) >@@ -314,8 +314,6 @@ namespace JSC { > enum WriteBarrierMode { UnconditionalWriteBarrier, ShouldFilterValue, ShouldFilterBaseAndValue }; > // value register in write barrier is used before any scratch registers > // so may safely be the same as either of the scratch registers. >- Jump checkMarkByte(RegisterID owner); >- Jump checkMarkByte(JSCell* owner); > void emitWriteBarrier(unsigned owner, unsigned value, WriteBarrierMode); > void emitWriteBarrier(JSCell* owner, unsigned value, WriteBarrierMode); > void emitWriteBarrier(JSCell* owner); >Index: Source/JavaScriptCore/jit/JITPropertyAccess.cpp >=================================================================== >--- Source/JavaScriptCore/jit/JITPropertyAccess.cpp (revision 165160) >+++ Source/JavaScriptCore/jit/JITPropertyAccess.cpp (working copy) >@@ -879,17 +879,6 @@ void JIT::emit_op_init_global_const(Inst > > #endif // USE(JSVALUE64) > >-JIT::Jump JIT::checkMarkByte(RegisterID owner) >-{ >- return branchTest8(NonZero, Address(owner, JSCell::gcDataOffset())); >-} >- >-JIT::Jump JIT::checkMarkByte(JSCell* owner) >-{ >- uint8_t* address = reinterpret_cast<uint8_t*>(owner) + JSCell::gcDataOffset(); >- return branchTest8(NonZero, AbsoluteAddress(address)); >-} >- > #if USE(JSVALUE64) > void JIT::emitWriteBarrier(unsigned owner, unsigned value, WriteBarrierMode mode) > { >Index: Source/JavaScriptCore/jit/Repatch.cpp >=================================================================== >--- Source/JavaScriptCore/jit/Repatch.cpp (revision 165160) >+++ Source/JavaScriptCore/jit/Repatch.cpp (working copy) >@@ -824,13 +824,10 @@ static MacroAssembler::Call writeBarrier > ASSERT(owner != scratch1); > ASSERT(owner != scratch2); > >-#if ENABLE(DFG_JIT) >- MacroAssembler::Jump ownerNotMarkedOrAlreadyRemembered = DFG::SpeculativeJIT::checkMarkByte(jit, owner); >-#endif >+ MacroAssembler::Jump ownerNotMarkedOrAlreadyRemembered = jit.checkMarkByte(owner); > MacroAssembler::Call call = storeToWriteBarrierBuffer(jit, owner, scratch1, scratch2, allocator); >-#if ENABLE(DFG_JIT) > ownerNotMarkedOrAlreadyRemembered.link(&jit); >-#endif >+ > return call; > } > #endif // ENABLE(GGC)
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 129760
: 225939