Changeset 277475 in webkit
- Timestamp:
- May 13, 2021, 7:03:43 PM (5 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 4 edited
-
ChangeLog (modified) (1 diff)
-
bytecode/CodeBlock.cpp (modified) (2 diffs)
-
bytecode/CodeBlock.h (modified) (3 diffs)
-
ftl/FTLCompile.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r277449 r277475 1 2021-05-13 Geoffrey Garen <ggaren@apple.com> 2 3 m_calleeSaveRegisters should not be a pointer to a pointer 4 https://bugs.webkit.org/show_bug.cgi?id=225787 5 6 Reviewed by Keith Miller. 7 8 Ben found this through memory stress testing. 9 10 RegisterAtOffsetList is effectively just a pointer. unique_ptr<RegisterAtOffsetList> 11 is a pointer to a pointer. RegisterAtOffsetList is long-lived, so it 12 creates heap page fragmentation. 13 14 Worth 3MB on Ben's test. 15 16 * bytecode/CodeBlock.cpp: 17 (JSC::CodeBlock::setCalleeSaveRegisters): 18 (JSC::CodeBlock::calleeSaveRegisters const): Use a fence before setting 19 m_hasCalleeSaveRegisters to ensure that all writes have completed before 20 the struct becomes visible. 21 22 * bytecode/CodeBlock.h: Use RegisterAtOffsetList directly instead of 23 unique_ptr<RegisterAtOffsetList> to avoid a long-lived lonely 8 byte 24 allocation. 25 26 * ftl/FTLCompile.cpp: 27 (JSC::FTL::compile): Updated for type change. 28 1 29 2021-05-13 Chris Dumez <cdumez@apple.com> 2 30 -
trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp
r276655 r277475 1791 1791 } 1792 1792 1793 void CodeBlock::setCalleeSaveRegisters(RegisterSet calleeSaveRegisters) 1794 { 1793 void CodeBlock::setCalleeSaveRegisters(RegisterSet registerSet) 1794 { 1795 auto calleeSaveRegisters = RegisterAtOffsetList(registerSet); 1796 1795 1797 ConcurrentJSLocker locker(m_lock); 1796 ensureJITData(locker).m_calleeSaveRegisters = makeUnique<RegisterAtOffsetList>(calleeSaveRegisters); 1797 } 1798 1799 void CodeBlock::setCalleeSaveRegisters(std::unique_ptr<RegisterAtOffsetList> registerAtOffsetList) 1798 auto& jitData = ensureJITData(locker); 1799 jitData.m_calleeSaveRegisters = WTFMove(calleeSaveRegisters); 1800 WTF::storeStoreFence(); 1801 jitData.m_hasCalleeSaveRegisters = true; 1802 } 1803 1804 void CodeBlock::setCalleeSaveRegisters(RegisterAtOffsetList&& registerAtOffsetList) 1800 1805 { 1801 1806 ConcurrentJSLocker locker(m_lock); 1802 ensureJITData(locker).m_calleeSaveRegisters = WTFMove(registerAtOffsetList); 1807 auto& jitData = ensureJITData(locker); 1808 jitData.m_calleeSaveRegisters = WTFMove(registerAtOffsetList); 1809 WTF::storeStoreFence(); 1810 jitData.m_hasCalleeSaveRegisters = true; 1803 1811 } 1804 1812 … … 2493 2501 #if ENABLE(JIT) 2494 2502 if (auto* jitData = m_jitData.get()) { 2495 if ( const RegisterAtOffsetList* registers = jitData->m_calleeSaveRegisters.get())2496 return registers;2503 if (jitData->m_hasCalleeSaveRegisters) 2504 return &jitData->m_calleeSaveRegisters; 2497 2505 } 2498 2506 #endif -
trunk/Source/JavaScriptCore/bytecode/CodeBlock.h
r277383 r277475 65 65 #include "ProgramExecutable.h" 66 66 #include "PutPropertySlot.h" 67 #include "RegisterAtOffsetList.h" 67 68 #include "ValueProfile.h" 68 69 #include "VirtualRegister.h" … … 284 285 FixedVector<StringJumpTable> m_stringSwitchJumpTables; 285 286 std::unique_ptr<PCToCodeOriginMap> m_pcToCodeOriginMap; 286 std::unique_ptr<RegisterAtOffsetList> m_calleeSaveRegisters; 287 bool m_hasCalleeSaveRegisters { false }; 288 RegisterAtOffsetList m_calleeSaveRegisters; 287 289 JITCodeMap m_jitCodeMap; 288 290 }; … … 344 346 345 347 void setCalleeSaveRegisters(RegisterSet); 346 void setCalleeSaveRegisters( std::unique_ptr<RegisterAtOffsetList>);348 void setCalleeSaveRegisters(RegisterAtOffsetList&&); 347 349 348 350 void setRareCaseProfiles(FixedVector<RareCaseProfile>&&); -
trunk/Source/JavaScriptCore/ftl/FTLCompile.cpp
r277383 r277475 72 72 return; 73 73 74 std::unique_ptr<RegisterAtOffsetList> registerOffsets = 75 makeUnique<RegisterAtOffsetList>(state.proc->calleeSaveRegisterAtOffsetList()); 74 RegisterAtOffsetList registerOffsets = state.proc->calleeSaveRegisterAtOffsetList(); 76 75 if (shouldDumpDisassembly()) 77 dataLog(tierName, "Unwind info for ", CodeBlockWithJITType(codeBlock, JITType::FTLJIT), ": ", *registerOffsets, "\n");76 dataLog(tierName, "Unwind info for ", CodeBlockWithJITType(codeBlock, JITType::FTLJIT), ": ", registerOffsets, "\n"); 78 77 codeBlock->setCalleeSaveRegisters(WTFMove(registerOffsets)); 79 78 ASSERT(!(state.proc->frameSize() % sizeof(EncodedJSValue)));
Note:
See TracChangeset
for help on using the changeset viewer.