Changeset 175593 in webkit
- Timestamp:
- Nov 4, 2014 5:19:37 PM (9 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r175588 r175593 1 2014-11-04 Mark Lam <mark.lam@apple.com> 2 3 Rename checkMarkByte() to jumpIfIsRememberedOrInEden(). 4 <https://webkit.org/b/138369> 5 6 Reviewed by Geoffrey Garen. 7 8 Write barriers are needed for GC Eden collections so that we can scan pointers 9 pointing from old generation objects to eden generation objects. The barrier 10 currently checks the mark byte in a cell to see if we should skip adding the 11 cell to the GC remembered set. The addition should be skipped if: 12 13 1. The cell is in the young generation. It has no old to eden pointers by 14 definition. 15 2. The cell is already in the remembered set. While it is ok to add the cell 16 to the GC remembered set more than once, it would be redundant. Hence, 17 we skip this as an optimization to avoid doing unnecessary work. 18 19 The barrier currently names this check as checkMarkByte(). We should rename it 20 to jumpIfIsRememberedOrInEden() to be clearer about its intent. 21 22 Similarly, Jump results of this check are currently named 23 ownerNotMarkedOrAlreadyRemembered. This can be misinterpreted as the owner is 24 not marked or not already remembered. We should rename it to 25 ownerIsRememberedOrInEden which is clearer about the intent of the 26 check. What we are really checking for is that the cell is in the eden gen, 27 which is implied by it being "not marked". 28 29 * dfg/DFGOSRExitCompilerCommon.cpp: 30 (JSC::DFG::osrWriteBarrier): 31 * dfg/DFGSpeculativeJIT.cpp: 32 (JSC::DFG::SpeculativeJIT::writeBarrier): 33 * dfg/DFGSpeculativeJIT32_64.cpp: 34 (JSC::DFG::SpeculativeJIT::writeBarrier): 35 * dfg/DFGSpeculativeJIT64.cpp: 36 (JSC::DFG::SpeculativeJIT::writeBarrier): 37 * jit/AssemblyHelpers.h: 38 (JSC::AssemblyHelpers::jumpIfIsRememberedOrInEden): 39 (JSC::AssemblyHelpers::checkMarkByte): Deleted. 40 * jit/JITPropertyAccess.cpp: 41 (JSC::JIT::emitWriteBarrier): 42 * llint/LowLevelInterpreter.asm: 43 * llint/LowLevelInterpreter32_64.asm: 44 * llint/LowLevelInterpreter64.asm: 45 * runtime/JSCell.h: 46 1 47 2014-11-04 Joseph Pecoraro <pecoraro@apple.com> 2 48 -
trunk/Source/JavaScriptCore/dfg/DFGOSRExitCompilerCommon.cpp
r174371 r175593 249 249 static void osrWriteBarrier(CCallHelpers& jit, GPRReg owner, GPRReg scratch) 250 250 { 251 AssemblyHelpers::Jump owner NotMarkedOrAlreadyRemembered = jit.checkMarkByte(owner);251 AssemblyHelpers::Jump ownerIsRememberedOrInEden = jit.jumpIfIsRememberedOrInEden(owner); 252 252 253 253 // We need these extra slots because setupArgumentsWithExecState will use poke on x86. … … 264 264 #endif 265 265 266 owner NotMarkedOrAlreadyRemembered.link(&jit);266 ownerIsRememberedOrInEden.link(&jit); 267 267 } 268 268 #endif // ENABLE(GGC) -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
r174795 r175593 5473 5473 return; 5474 5474 5475 JITCompiler::Jump owner NotMarkedOrAlreadyRemembered = m_jit.checkMarkByte(ownerGPR);5475 JITCompiler::Jump ownerIsRememberedOrInEden = m_jit.jumpIfIsRememberedOrInEden(ownerGPR); 5476 5476 storeToWriteBarrierBuffer(ownerGPR, scratch1, scratch2); 5477 owner NotMarkedOrAlreadyRemembered.link(&m_jit);5477 ownerIsRememberedOrInEden.link(&m_jit); 5478 5478 } 5479 5479 5480 5480 void SpeculativeJIT::writeBarrier(GPRReg ownerGPR, GPRReg scratch1, GPRReg scratch2) 5481 5481 { 5482 JITCompiler::Jump owner NotMarkedOrAlreadyRemembered = m_jit.checkMarkByte(ownerGPR);5482 JITCompiler::Jump ownerIsRememberedOrInEden = m_jit.jumpIfIsRememberedOrInEden(ownerGPR); 5483 5483 storeToWriteBarrierBuffer(ownerGPR, scratch1, scratch2); 5484 owner NotMarkedOrAlreadyRemembered.link(&m_jit);5484 ownerIsRememberedOrInEden.link(&m_jit); 5485 5485 } 5486 5486 #else -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp
r174226 r175593 4942 4942 isNotCell = m_jit.branch32(JITCompiler::NotEqual, valueTagGPR, JITCompiler::TrustedImm32(JSValue::CellTag)); 4943 4943 4944 JITCompiler::Jump owner NotMarkedOrAlreadyRemembered = m_jit.checkMarkByte(ownerGPR);4944 JITCompiler::Jump ownerIsRememberedOrInEden = m_jit.jumpIfIsRememberedOrInEden(ownerGPR); 4945 4945 storeToWriteBarrierBuffer(ownerGPR, scratch1, scratch2); 4946 owner NotMarkedOrAlreadyRemembered.link(&m_jit);4946 ownerIsRememberedOrInEden.link(&m_jit); 4947 4947 4948 4948 if (!isKnownCell(valueUse.node())) … … 4956 4956 isNotCell = m_jit.branch32(JITCompiler::NotEqual, valueTagGPR, JITCompiler::TrustedImm32(JSValue::CellTag)); 4957 4957 4958 JITCompiler::Jump owner NotMarkedOrAlreadyRemembered = m_jit.checkMarkByte(owner);4958 JITCompiler::Jump ownerIsRememberedOrInEden = m_jit.jumpIfIsRememberedOrInEden(owner); 4959 4959 storeToWriteBarrierBuffer(owner, scratch1, scratch2); 4960 owner NotMarkedOrAlreadyRemembered.link(&m_jit);4960 ownerIsRememberedOrInEden.link(&m_jit); 4961 4961 4962 4962 if (!isKnownCell(valueUse.node())) -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp
r174226 r175593 5032 5032 isNotCell = branchNotCell(JSValueRegs(valueGPR)); 5033 5033 5034 JITCompiler::Jump owner NotMarkedOrAlreadyRemembered = m_jit.checkMarkByte(ownerGPR);5034 JITCompiler::Jump ownerIsRememberedOrInEden = m_jit.jumpIfIsRememberedOrInEden(ownerGPR); 5035 5035 storeToWriteBarrierBuffer(ownerGPR, scratch1, scratch2); 5036 owner NotMarkedOrAlreadyRemembered.link(&m_jit);5036 ownerIsRememberedOrInEden.link(&m_jit); 5037 5037 5038 5038 if (!isKnownCell(valueUse.node())) … … 5046 5046 isNotCell = branchNotCell(JSValueRegs(valueGPR)); 5047 5047 5048 JITCompiler::Jump owner NotMarkedOrAlreadyRemembered = m_jit.checkMarkByte(owner);5048 JITCompiler::Jump ownerIsRememberedOrInEden = m_jit.jumpIfIsRememberedOrInEden(owner); 5049 5049 storeToWriteBarrierBuffer(owner, scratch1, scratch2); 5050 owner NotMarkedOrAlreadyRemembered.link(&m_jit);5050 ownerIsRememberedOrInEden.link(&m_jit); 5051 5051 5052 5052 if (!isKnownCell(valueUse.node())) -
trunk/Source/JavaScriptCore/jit/AssemblyHelpers.h
r173222 r175593 666 666 static void emitStoreStructureWithTypeInfo(AssemblyHelpers& jit, TrustedImmPtr structure, RegisterID dest); 667 667 668 Jump checkMarkByte(GPRReg cell)668 Jump jumpIfIsRememberedOrInEden(GPRReg cell) 669 669 { 670 670 return branchTest8(MacroAssembler::NonZero, MacroAssembler::Address(cell, JSCell::gcDataOffset())); 671 671 } 672 672 673 Jump checkMarkByte(JSCell* cell)673 Jump jumpIfIsRememberedOrInEden(JSCell* cell) 674 674 { 675 675 uint8_t* address = reinterpret_cast<uint8_t*>(cell) + JSCell::gcDataOffset(); -
trunk/Source/JavaScriptCore/jit/JITPropertyAccess.cpp
r175471 r175593 829 829 ownerNotCell = branchTest64(NonZero, regT0, tagMaskRegister); 830 830 831 Jump owner NotMarkedOrAlreadyRemembered = checkMarkByte(regT0);831 Jump ownerIsRememberedOrInEden = jumpIfIsRememberedOrInEden(regT0); 832 832 callOperation(operationUnconditionalWriteBarrier, regT0); 833 owner NotMarkedOrAlreadyRemembered.link(this);833 ownerIsRememberedOrInEden.link(this); 834 834 835 835 if (mode == ShouldFilterBaseAndValue || mode == ShouldFilterBase) … … 879 879 ownerNotCell = branch32(NotEqual, regT0, TrustedImm32(JSValue::CellTag)); 880 880 881 Jump owner NotMarkedOrAlreadyRemembered = checkMarkByte(regT1);881 Jump ownerIsRememberedOrInEden = jumpIfIsRememberedOrInEden(regT1); 882 882 callOperation(operationUnconditionalWriteBarrier, regT1); 883 owner NotMarkedOrAlreadyRemembered.link(this);883 ownerIsRememberedOrInEden.link(this); 884 884 885 885 if (mode == ShouldFilterBase || mode == ShouldFilterBaseAndValue) … … 920 920 #if ENABLE(GGC) 921 921 if (!MarkedBlock::blockFor(owner)->isMarked(owner)) { 922 Jump owner NotMarkedOrAlreadyRemembered = checkMarkByte(owner);922 Jump ownerIsRememberedOrInEden = jumpIfIsRememberedOrInEden(owner); 923 923 callOperation(operationUnconditionalWriteBarrier, owner); 924 owner NotMarkedOrAlreadyRemembered.link(this);924 ownerIsRememberedOrInEden.link(this); 925 925 } else 926 926 callOperation(operationUnconditionalWriteBarrier, owner); -
trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.asm
r175426 r175593 510 510 end 511 511 512 macro checkMarkByte(cell, scratch1, scratch2, continuation)512 macro skipIfIsRememberedOrInEden(cell, scratch1, scratch2, continuation) 513 513 loadb JSCell::m_gcData[cell], scratch1 514 514 continuation(scratch1) -
trunk/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm
r175508 r175593 570 570 loadisFromInstruction(cellOperand, t1) 571 571 loadConstantOrVariablePayload(t1, CellTag, t2, .writeBarrierDone) 572 checkMarkByte(t2, t1, t3,572 skipIfIsRememberedOrInEden(t2, t1, t3, 573 573 macro(gcData) 574 574 btbnz gcData, .writeBarrierDone … … 604 604 loadp CodeBlock[cfr], t3 605 605 loadp CodeBlock::m_globalObject[t3], t3 606 checkMarkByte(t3, t1, t2,606 skipIfIsRememberedOrInEden(t3, t1, t2, 607 607 macro(gcData) 608 608 btbnz gcData, .writeBarrierDone -
trunk/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm
r175508 r175593 444 444 loadisFromInstruction(cellOperand, t1) 445 445 loadConstantOrVariableCell(t1, t2, .writeBarrierDone) 446 checkMarkByte(t2, t1, t3,446 skipIfIsRememberedOrInEden(t2, t1, t3, 447 447 macro(gcData) 448 448 btbnz gcData, .writeBarrierDone … … 475 475 loadp CodeBlock[cfr], t3 476 476 loadp CodeBlock::m_globalObject[t3], t3 477 checkMarkByte(t3, t1, t2,477 skipIfIsRememberedOrInEden(t3, t1, t2, 478 478 macro(gcData) 479 479 btbnz gcData, .writeBarrierDone -
trunk/Source/JavaScriptCore/runtime/JSCell.h
r174122 r175593 148 148 149 149 enum GCData : uint8_t { 150 Marked = 0, 151 NotMarked = 1, 152 MarkedAndRemembered = 2, 150 Marked = 0, // The object has survived a GC and is in the old gen. 151 NotMarked = 1, // The object is new and in the eden gen. 152 MarkedAndRemembered = 2, // The object is in the GC's remembered set. 153 154 // The object being in the GC's remembered set implies that it is also 155 // Marked. This is because objects are only added to the remembered sets 156 // by write barriers, and write barriers are only interested in old gen 157 // objects that point to potential eden gen objects. 153 158 }; 154 159
Note: See TracChangeset
for help on using the changeset viewer.