Branch: master
Find file History
ysuzuki@apple.com
ysuzuki@apple.com [JSC] Shrink size of VM by lazily allocating IsoSubspaces for non-com…
…mon types

https://bugs.webkit.org/show_bug.cgi?id=193993

Reviewed by Keith Miller.

Source/JavaScriptCore:

JSC::VM has a lot of IsoSubspaces, and each takes 504B. This unnecessarily makes VM so large.
And some of them are rarely used. We should allocate it lazily.

In this patch, we make some `IsoSubspaces` `std::unique_ptr<IsoSubspace>`. And we add ensureXXXSpace
functions which allocate IsoSubspaces lazily. This function is used by subspaceFor<> in each class.
And we also add subspaceForConcurrently<> function, which is called from concurrent JIT tiers. This
returns nullptr if the subspace is not allocated yet. JSCell::subspaceFor now takes second template
parameter which tells the function whether subspaceFor is concurrently done. If the IsoSubspace is
lazily created, we may return nullptr for the concurrent access. We ensure the space's initialization
by using WTF::storeStoreFence when lazily allocating it.

In GC's constraint solving, we may touch these lazily allocated spaces. At that time, we check the
existence of the space before touching this. This is not racy because the main thread is stopped when
the constraint solving is working.

This changes sizeof(VM) from 64736 to 56472.

Another interesting thing is that we removed `PreventCollectionScope preventCollectionScope(heap);` in
`Subspace::initialize`. This is really dangerous API since it easily causes dead-lock between the
collector and the mutator if IsoSubspace is dynamically created. We do want to make IsoSubspaces
dynamically-created ones since the requirement of the pre-allocation poses a scalability problem
of IsoSubspace adoption because IsoSubspace is large. Registered Subspace is only touched in the
EndPhase, and the peripheries should be stopped when running EndPhase. Thus, as long as the main thread
can run this IsoSubspace code, the collector is never EndPhase. So this is safe.

* API/JSCallbackFunction.h:
* API/ObjCCallbackFunction.h:
(JSC::ObjCCallbackFunction::subspaceFor):
* API/glib/JSCCallbackFunction.h:
* CMakeLists.txt:
* JavaScriptCore.xcodeproj/project.pbxproj:
* bytecode/CodeBlock.cpp:
(JSC::CodeBlock::visitChildren):
(JSC::CodeBlock::finalizeUnconditionally):
* bytecode/CodeBlock.h:
* bytecode/EvalCodeBlock.h:
* bytecode/ExecutableToCodeBlockEdge.h:
* bytecode/FunctionCodeBlock.h:
* bytecode/ModuleProgramCodeBlock.h:
* bytecode/ProgramCodeBlock.h:
* bytecode/UnlinkedFunctionExecutable.cpp:
(JSC::UnlinkedFunctionExecutable::unlinkedCodeBlockFor):
* bytecode/UnlinkedFunctionExecutable.h:
* dfg/DFGSpeculativeJIT.cpp:
(JSC::DFG::SpeculativeJIT::emitAllocateRawObject):
(JSC::DFG::SpeculativeJIT::compileMakeRope):
(JSC::DFG::SpeculativeJIT::compileNewObject):
* ftl/FTLLowerDFGToB3.cpp:
(JSC::FTL::DFG::LowerDFGToB3::compileMakeRope):
(JSC::FTL::DFG::LowerDFGToB3::compileMaterializeNewObject):
(JSC::FTL::DFG::LowerDFGToB3::allocateObject):
(JSC::FTL::DFG::LowerDFGToB3::allocateVariableSizedObject):
(JSC::FTL::DFG::LowerDFGToB3::allocateVariableSizedCell):
* heap/Heap.cpp:
(JSC::Heap::finalizeUnconditionalFinalizers):
(JSC::Heap::deleteAllCodeBlocks):
(JSC::Heap::deleteAllUnlinkedCodeBlocks):
(JSC::Heap::addCoreConstraints):
* heap/Subspace.cpp:
(JSC::Subspace::initialize):
* jit/AssemblyHelpers.h:
(JSC::AssemblyHelpers::emitAllocateJSObjectWithKnownSize):
(JSC::AssemblyHelpers::emitAllocateVariableSizedCell):
* jit/JITOpcodes.cpp:
(JSC::JIT::emit_op_new_object):
* jit/JITOpcodes32_64.cpp:
(JSC::JIT::emit_op_new_object):
* runtime/DirectArguments.h:
* runtime/DirectEvalExecutable.h:
* runtime/ErrorInstance.h:
(JSC::ErrorInstance::subspaceFor):
* runtime/ExecutableBase.h:
* runtime/FunctionExecutable.h:
* runtime/IndirectEvalExecutable.h:
* runtime/InferredValue.cpp:
(JSC::InferredValue::visitChildren):
* runtime/InferredValue.h:
* runtime/InferredValueInlines.h:
(JSC::InferredValue::finalizeUnconditionally):
* runtime/InternalFunction.h:
* runtime/JSAsyncFunction.h:
* runtime/JSAsyncGeneratorFunction.h:
* runtime/JSBoundFunction.h:
* runtime/JSCell.h:
(JSC::subspaceFor):
(JSC::subspaceForConcurrently):
* runtime/JSCellInlines.h:
(JSC::allocatorForNonVirtualConcurrently):
* runtime/JSCustomGetterSetterFunction.h:
* runtime/JSDestructibleObject.h:
* runtime/JSFunction.h:
* runtime/JSGeneratorFunction.h:
* runtime/JSImmutableButterfly.h:
* runtime/JSLexicalEnvironment.h:
(JSC::JSLexicalEnvironment::subspaceFor):
* runtime/JSNativeStdFunction.h:
* runtime/JSSegmentedVariableObject.h:
* runtime/JSString.h:
* runtime/ModuleProgramExecutable.h:
* runtime/NativeExecutable.h:
* runtime/ProgramExecutable.h:
* runtime/PropertyMapHashTable.h:
* runtime/ProxyRevoke.h:
* runtime/ScopedArguments.h:
* runtime/ScriptExecutable.cpp:
(JSC::ScriptExecutable::clearCode):
(JSC::ScriptExecutable::installCode):
* runtime/Structure.h:
* runtime/StructureRareData.h:
* runtime/SubspaceAccess.h: Copied from Source/JavaScriptCore/runtime/InferredValueInlines.h.
* runtime/VM.cpp:
(JSC::VM::VM):
* runtime/VM.h:
(JSC::VM::SpaceAndSet::SpaceAndSet):
(JSC::VM::SpaceAndSet::setFor):
(JSC::VM::forEachScriptExecutableSpace):
(JSC::VM::SpaceAndFinalizerSet::SpaceAndFinalizerSet): Deleted.
(JSC::VM::SpaceAndFinalizerSet::finalizerSetFor): Deleted.
(JSC::VM::ScriptExecutableSpaceAndSet::ScriptExecutableSpaceAndSet): Deleted.
(JSC::VM::ScriptExecutableSpaceAndSet::clearableCodeSetFor): Deleted.
(JSC::VM::UnlinkedFunctionExecutableSpaceAndSet::UnlinkedFunctionExecutableSpaceAndSet): Deleted.
(JSC::VM::UnlinkedFunctionExecutableSpaceAndSet::clearableCodeSetFor): Deleted.
* runtime/WeakMapImpl.h:
(JSC::WeakMapImpl::subspaceFor):
* wasm/js/JSWebAssemblyCodeBlock.h:
* wasm/js/JSWebAssemblyMemory.h:
* wasm/js/WebAssemblyFunction.h:
* wasm/js/WebAssemblyWrapperFunction.h:

Source/WebCore:

* bindings/scripts/CodeGeneratorJS.pm:
(GenerateHeader):
* bridge/runtime_method.h:

Source/WebKit:

* WebProcess/Plugins/Netscape/JSNPMethod.h:
* WebProcess/Plugins/Netscape/JSNPObject.h:

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@240965 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Latest commit 64b74db Feb 5, 2019
Permalink
Type Name Latest commit message Commit time
..
Failed to load latest commit information.
js [JSC] Shrink size of VM by lazily allocating IsoSubspaces for non-com… Feb 5, 2019
WasmAirIRGenerator.cpp [WebAssembly] Change BBQ to generate Air IR Jan 31, 2019
WasmAirIRGenerator.h [WebAssembly] Change BBQ to generate Air IR Jan 31, 2019
WasmB3IRGenerator.cpp [WebAssembly] Change BBQ to generate Air IR Jan 31, 2019
WasmB3IRGenerator.h WebAssembly: NFC renames of things that aren't JS-specific Oct 24, 2017
WasmBBQPlan.cpp [WebAssembly] Change BBQ to generate Air IR Jan 31, 2019
WasmBBQPlan.h [WebAssembly] Parse wasm modules in a streaming fashion Aug 28, 2018
WasmBBQPlanInlines.h WebAssembly: Wasm::IndexOrName has a raw pointer to Name Nov 1, 2017
WasmBinding.cpp Templatize CodePtr/Refs/FunctionPtrs with PtrTags. Apr 18, 2018
WasmBinding.h Templatize CodePtr/Refs/FunctionPtrs with PtrTags. Apr 18, 2018
WasmCallee.cpp Apply PtrTags to the MetaAllocator and friends. Apr 30, 2018
WasmCallee.h Templatize CodePtr/Refs/FunctionPtrs with PtrTags. Apr 18, 2018
WasmCallingConvention.cpp [WebAssembly] Change BBQ to generate Air IR Jan 31, 2019
WasmCallingConvention.h [WebAssembly] Change BBQ to generate Air IR Jan 31, 2019
WasmCodeBlock.cpp Use MacroAssemblerCodePtr in Wasm code for code pointers instead of v… Mar 30, 2018
WasmCodeBlock.h Templatize CodePtr/Refs/FunctionPtrs with PtrTags. Apr 18, 2018
WasmContext.h WebAssembly: no VM / JS version of our implementation Oct 26, 2017
WasmContextInlines.h [WebAssembly] Inline WasmContext accessor functions Sep 13, 2018
WasmCreationMode.h Unreviewed, reland r230697, r230720, and r230724. Apr 18, 2018
WasmEmbedder.h WebAssembly: no VM / JS version of our implementation Oct 26, 2017
WasmExceptionType.h [WebAssembly] I64 arguments / return value check should be moved from… Nov 19, 2018
WasmFaultSignalHandler.cpp Static global 'fastHandlerInstalled' conditionally declared in WasmFa… Oct 31, 2018
WasmFaultSignalHandler.h WebAssembly: no VM / JS version of everything but Instance Oct 20, 2017
WasmFormat.cpp WebAssembly: update arbitrary limits to what browsers use Oct 27, 2017
WasmFormat.h wtf/Optional.h: move-constructor and move-assignment operator should … Dec 20, 2018
WasmFunctionParser.h [WebAssembly] Change BBQ to generate Air IR Jan 31, 2019
WasmIndexOrName.cpp [WTF] Add user-defined literal for ASCIILiteral Jun 23, 2018
WasmIndexOrName.h WebAssembly: stack trace improvement follow-ups Dec 1, 2017
WasmInstance.cpp WebAssembly: restore cached stack limit after out-call Dec 1, 2017
WasmInstance.h Add base class to get WeakPtrFactory member and avoid some boilerplat… Jun 8, 2018
WasmLimits.h WebAssembly: update arbitrary limits to what browsers use Oct 27, 2017
WasmMachineThreads.cpp [WTF] Implement WTF::ThreadGroup Jul 19, 2017
WasmMachineThreads.h WebAssembly: Implement tier up Apr 26, 2017
WasmMemory.cpp Creating a wasm memory that is bigger than the ArrayBuffer limit but … Nov 22, 2018
WasmMemory.h [JSC] Rename createXXX to tryCreateXXX if it can return RefPtr Oct 10, 2018
WasmMemoryInformation.cpp [WebAssembly] Inline WasmContext accessor functions Sep 13, 2018
WasmMemoryInformation.h Fix typos in closing ENABLE guards Nov 5, 2018
WasmMemoryMode.cpp WebAssembly: no VM / JS version of everything but Instance Oct 20, 2017
WasmMemoryMode.h Fix typos in closing ENABLE() comments Nov 19, 2017
WasmModule.cpp WebAssembly: no VM / JS version of everything but Instance Oct 20, 2017
WasmModule.h [WebAssembly] Optimize JS to Wasm call by using pointer of Signature … Sep 7, 2018
WasmModuleInformation.cpp [WebAssembly] Parse wasm modules in a streaming fashion Aug 28, 2018
WasmModuleInformation.h wtf/Optional.h: move-constructor and move-assignment operator should … Dec 20, 2018
WasmModuleParser.cpp [WebAssembly] Inline WasmContext accessor functions Sep 13, 2018
WasmModuleParser.h [WebAssembly] Parse wasm modules in a streaming fashion Aug 28, 2018
WasmName.h WebAssembly: support name section May 10, 2017
WasmNameSection.h wtf/Optional.h: move-constructor and move-assignment operator should … Dec 20, 2018
WasmNameSectionParser.cpp [WebAssembly] Parse wasm modules in a streaming fashion Aug 28, 2018
WasmNameSectionParser.h [WebAssembly] Parse wasm modules in a streaming fashion Aug 28, 2018
WasmOMGPlan.cpp [WebAssembly] Optimize JS to Wasm call by using pointer of Signature … Sep 7, 2018
WasmOMGPlan.h WebAssembly: no VM / JS version of our implementation Oct 26, 2017
WasmOpcodeOrigin.cpp WebAssembly: pack OpcodeOrigin to fit in a pointer Mar 29, 2017
WasmOpcodeOrigin.h Missing #pragma once in WasmOpcodeOrigin.h Oct 18, 2018
WasmPageCount.cpp WebAssembly: handle and optimize wasm export → wasm import calls Jan 3, 2017
WasmPageCount.h Fix typos in closing ENABLE guards Nov 5, 2018
WasmParser.h Rename <wtf/unicode/UTF8.h> to <wtf/unicode/UTF8Conversion.h> in orde… Nov 2, 2018
WasmPlan.cpp [WebAssembly] Parse wasm modules in a streaming fashion Aug 28, 2018
WasmPlan.h [WebAssembly] Parse wasm modules in a streaming fashion Aug 28, 2018
WasmSectionParser.cpp wtf/Optional.h: move-constructor and move-assignment operator should … Dec 20, 2018
WasmSectionParser.h wtf/Optional.h: move-constructor and move-assignment operator should … Dec 20, 2018
WasmSections.h Add IGNORE_WARNING_.* macros Sep 12, 2018
WasmSignature.cpp [WebAssembly] Optimize JS to Wasm call by using pointer of Signature … Sep 7, 2018
WasmSignature.h [WebAssembly] Optimize JS to Wasm call by using pointer of Signature … Sep 7, 2018
WasmSignatureInlines.h [WebAssembly] Optimize JS to Wasm call by using pointer of Signature … Sep 7, 2018
WasmStreamingParser.cpp wtf/Optional.h: move-constructor and move-assignment operator should … Dec 20, 2018
WasmStreamingParser.h wtf/Optional.h: move-constructor and move-assignment operator should … Dec 20, 2018
WasmTable.cpp wtf/Optional.h: move-constructor and move-assignment operator should … Dec 20, 2018
WasmTable.h wtf/Optional.h: move-constructor and move-assignment operator should … Dec 20, 2018
WasmThunks.cpp Templatize CodePtr/Refs/FunctionPtrs with PtrTags. Apr 18, 2018
WasmThunks.h Templatize CodePtr/Refs/FunctionPtrs with PtrTags. Apr 18, 2018
WasmTierUpCount.h WebAssembly: Don't tier up the same function twice Apr 27, 2017
WasmValidate.cpp [WebAssembly] Change BBQ to generate Air IR Jan 31, 2019
WasmValidate.h WebAssembly: ModuleInformation should be a ref counted thing that can… Apr 5, 2017
WasmWorklist.cpp [WTF] Use Ref<> for the result type of non-failing factory functions Jun 23, 2018
WasmWorklist.h [WTF] Use Ref<> for the result type of non-failing factory functions Jun 23, 2018
generateWasm.py Build tools should work when the /usr/bin/python is python3 Sep 21, 2018
generateWasmB3IRGeneratorInlinesHeader.py WebAssembly: B3IRGenerator should pool constants Mar 30, 2017
generateWasmOpsHeader.py Replace hard-coded paths in shebangs with #!/usr/bin/env Jan 4, 2018
generateWasmValidateInlinesHeader.py Add IGNORE_WARNING_.* macros Sep 12, 2018
wasm.json WebAssembly: validate load / store alignment May 16, 2017