Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
https://bugs.webkit.org/show_bug.cgi?id=267681 rdar://120794646 Reviewed by Justin Michaud. This patch redesigns our CallIC, both RepatchingIC and DataIC. 1. We remove awkward slow path for CallIC. All CallIC thunks (virtual, poly, defaultCall etc.) are the same calling convension and it should be possible to be launched from the normal call dispatching path. This significantly eliminates the code bloat in JIT since we no longer need to generate tail-call sequence twice, one for dispatch and one for slow path. Now, all thunks are called after tail-call setup is done. It also eliminates tail-call sequence from poly IC repatching thunk. 2. CallLinkInfo::unlinkOrUpgrade is introduced. Previously, we always just invalidate CallLinkInfo when a new code is installed, like tiering up. But for DataIC, we can just replace the current code with the newly introduced one. This keeps DataIC working without reinitialization. 3. Removal of slow path makes it possible to use simplified virtual call path. We created new virtual call thunk and use it. 4. We simplify CodeBlock::noticeIncomingCall. The existing logic does not work well with tail-call, and it makes code much more complicated, while it does not offer benefit in benchmarks. 5. We fix LayoutTests/svg/animations/svglength-element-removed-crash.svg. This test is completely wrong: it does not account conservative GC, so it is extremely flaky with the changes in JSC side. * JSTests/stress/tail-call-stacks.js: Added. (shouldBe): (testTarget): (t1): (t2): (t3): (t4): (t5): (run): * LayoutTests/inspector/unit-tests/array-utilities-expected.txt: * LayoutTests/inspector/unit-tests/set-utilities-expected.txt: * LayoutTests/js/caller-property-expected.txt: * LayoutTests/js/script-tests/caller-property.js: * LayoutTests/svg/animations/svglength-element-removed-crash-expected.txt: * LayoutTests/svg/animations/svglength-element-removed-crash.svg: * Source/JavaScriptCore/assembler/MacroAssemblerARM64.h: (JSC::MacroAssemblerARM64::transfer32): (JSC::MacroAssemblerARM64::transfer64): (JSC::MacroAssemblerARM64::transferPtr): * Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h: (JSC::MacroAssemblerARMv7::transfer32): (JSC::MacroAssemblerARMv7::transferPtr): * Source/JavaScriptCore/assembler/MacroAssemblerRISCV64.h: (JSC::MacroAssemblerRISCV64::transfer32): (JSC::MacroAssemblerRISCV64::transfer64): (JSC::MacroAssemblerRISCV64::transferPtr): * Source/JavaScriptCore/assembler/MacroAssemblerX86_64.h: (JSC::MacroAssemblerX86_64::transfer32): (JSC::MacroAssemblerX86_64::transfer64): (JSC::MacroAssemblerX86_64::transferPtr): * Source/JavaScriptCore/bytecode/BytecodeList.rb: * Source/JavaScriptCore/bytecode/CallLinkInfo.cpp: (JSC::CallLinkInfo::unlinkOrUpgradeImpl): (JSC::CallLinkInfo::setMonomorphicCallee): (JSC::CallLinkInfo::visitWeak): (JSC::CallLinkInfo::revertCallToStub): (JSC::BaselineCallLinkInfo::initialize): (JSC::CallLinkInfo::retrieveCaller): (JSC::CallLinkInfo::reset): (JSC::CallLinkInfo::revertCall): (JSC::CallLinkInfo::setVirtualCall): (JSC::OptimizingCallLinkInfo::setSlowPathCallDestination): (JSC::CallLinkInfo::emitFastPathImpl): (JSC::CallLinkInfo::emitDataICFastPath): (JSC::CallLinkInfo::emitTailCallDataICFastPath): (JSC::CallLinkInfo::setStub): (JSC::CallLinkInfo::emitSlowPathImpl): (JSC::CallLinkInfo::emitDataICSlowPath): (JSC::CallLinkInfo::emitFastPath): (JSC::CallLinkInfo::emitTailCallFastPath): (JSC::CallLinkInfo::emitSlowPath): (JSC::CallLinkInfo::emitTailCallSlowPath): (JSC::OptimizingCallLinkInfo::emitFastPath): (JSC::OptimizingCallLinkInfo::emitTailCallFastPath): (JSC::OptimizingCallLinkInfo::emitSlowPath): (JSC::OptimizingCallLinkInfo::emitTailCallSlowPath): (JSC::OptimizingCallLinkInfo::setDirectCallTarget): (JSC::OptimizingCallLinkInfo::initializeFromDFGUnlinkedCallLinkInfo): (JSC::CallLinkInfo::unlinkImpl): Deleted. (JSC::CallLinkInfo::setSlowPathCallDestination): Deleted. (JSC::OptimizingCallLinkInfo::setFrameShuffleData): Deleted. * Source/JavaScriptCore/bytecode/CallLinkInfo.h: (JSC::CallLinkInfo::isLinked const): (JSC::CallLinkInfo::mode const): (JSC::CallLinkInfo::owner const): (JSC::CallLinkInfo::CallLinkInfo): (JSC::BaselineUnlinkedCallLinkInfo::setUpCall): (JSC::CallLinkInfo::offsetOfSlowPathCallDestination): Deleted. (JSC::BaselineUnlinkedCallLinkInfo::setFrameShuffleData): Deleted. (JSC::CallLinkInfo::calleeGPR const): Deleted. * Source/JavaScriptCore/bytecode/CallLinkInfoBase.cpp: (JSC::CallLinkInfoBase::unlinkOrUpgrade): (JSC::CallLinkInfoBase::unlink): Deleted. * Source/JavaScriptCore/bytecode/CallLinkInfoBase.h: * Source/JavaScriptCore/bytecode/CallLinkStatus.cpp: (JSC::CallLinkStatus::computeFromCallLinkInfo): * Source/JavaScriptCore/bytecode/CodeBlock.cpp: (JSC::CodeBlock::finishCreation): (JSC::CodeBlock::~CodeBlock): (JSC::CodeBlock::linkIncomingCall): (JSC::CodeBlock::unlinkOrUpgradeIncomingCalls): (JSC::CodeBlock::noticeIncomingCall): (JSC::CodeBlock::unlinkIncomingCalls): Deleted. * Source/JavaScriptCore/bytecode/CodeBlock.h: * Source/JavaScriptCore/bytecode/InlineCacheCompiler.cpp: (JSC::InlineCacheCompiler::generateImpl): (JSC::InlineCacheCompiler::emitProxyObjectAccess): * Source/JavaScriptCore/bytecode/Repatch.cpp: (JSC::linkSlowFor): (JSC::linkMonomorphicCall): (JSC::linkDirectCall): (JSC::linkPolymorphicCall): (JSC::linkSlowPathTo): Deleted. (JSC::revertCall): Deleted. (JSC::unlinkCall): Deleted. (JSC::linkVirtualFor): Deleted. * Source/JavaScriptCore/bytecode/Repatch.h: * Source/JavaScriptCore/bytecode/RepatchInlines.h: (JSC::throwNotAFunctionErrorFromCallIC): (JSC::throwNotAConstructorErrorFromCallIC): (JSC::handleHostCall): (JSC::linkFor): (JSC::virtualForWithFunction): * Source/JavaScriptCore/dfg/DFGJITCode.cpp: (JSC::DFG::JITData::tryInitialize): * Source/JavaScriptCore/dfg/DFGJITCode.h: (JSC::DFG::UnlinkedCallLinkInfo::setUpCall): (JSC::DFG::UnlinkedCallLinkInfo::setFrameShuffleData): Deleted. * Source/JavaScriptCore/dfg/DFGJITCompiler.cpp: (JSC::DFG::JITCompiler::addCallLinkInfo): * Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp: (JSC::DFG::SpeculativeJIT::emitCall): * Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp: (JSC::DFG::SpeculativeJIT::emitCall): * Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp: (JSC::FTL::DFG::LowerDFGToB3::compileCompareStrictEq): * Source/JavaScriptCore/ftl/FTLState.cpp: (JSC::FTL::State::addCallLinkInfo): * Source/JavaScriptCore/interpreter/CachedCall.h: (JSC::CachedCall::unlinkOrUpgradeImpl): (JSC::CachedCall::unlinkImpl): Deleted. * Source/JavaScriptCore/interpreter/Interpreter.cpp: (JSC::GetStackTraceFunctor::GetStackTraceFunctor): (JSC::Interpreter::getStackTrace): (JSC::Interpreter::prepareForCachedCall): * Source/JavaScriptCore/interpreter/Interpreter.h: * Source/JavaScriptCore/jit/BaselineJITRegisters.h: * Source/JavaScriptCore/jit/CCallHelpers.h: * Source/JavaScriptCore/jit/JIT.h: * Source/JavaScriptCore/jit/JITCall.cpp: (JSC::JIT::compileSetupFrame): (JSC::JIT::compileTailCall): (JSC::JIT::compileOpCall): (JSC::JIT::compileOpCallSlowCase): * Source/JavaScriptCore/jit/JITOperations.cpp: (JSC::JSC_DEFINE_JIT_OPERATION): * Source/JavaScriptCore/jit/JITOperations.h: * Source/JavaScriptCore/jit/JITStubRoutine.cpp: (JSC::JITStubRoutine::operator delete): * Source/JavaScriptCore/jit/JITStubRoutine.h: (JSC::JITStubRoutine::destroy): * Source/JavaScriptCore/jit/JITThunks.h: * Source/JavaScriptCore/jit/PolymorphicCallStubRoutine.cpp: (JSC::PolymorphicCallNode::unlinkOrUpgradeImpl): (JSC::PolymorphicCallNode::clear): (JSC::PolymorphicCallNode::owner): (JSC::PolymorphicCallStubRoutine::PolymorphicCallStubRoutine): (JSC::PolymorphicCallStubRoutine::upgradeIfPossible): (JSC::PolymorphicCallStubRoutine::variants const): (JSC::PolymorphicCallStubRoutine::edges const): (JSC::PolymorphicCallStubRoutine::clearCallNodesFor): (JSC::PolymorphicCallStubRoutine::markRequiredObjectsInternalImpl): (JSC::PolymorphicCallStubRoutine::destroy): (JSC::PolymorphicCallNode::unlinkImpl): Deleted. (JSC::PolymorphicCallNode::clearCallLinkInfo): Deleted. * Source/JavaScriptCore/jit/PolymorphicCallStubRoutine.h: * Source/JavaScriptCore/jit/ThunkGenerators.cpp: (JSC::virtualThunkFor): (JSC::polymorphicThunkFor): (JSC::polymorphicRepatchThunk): (JSC::slowPathFor): Deleted. (JSC::linkCallThunkGenerator): Deleted. (JSC::linkPolymorphicCallThunkGenerator): Deleted. * Source/JavaScriptCore/jit/ThunkGenerators.h: * Source/JavaScriptCore/llint/LLIntData.cpp: (JSC::LLInt::initialize): * Source/JavaScriptCore/llint/LLIntEntrypoint.cpp: (JSC::LLInt::defaultCall): * Source/JavaScriptCore/llint/LLIntEntrypoint.h: * Source/JavaScriptCore/llint/LLIntSlowPaths.cpp: (JSC::LLInt::llint_default_call): (JSC::LLInt::llint_virtual_call): (JSC::LLInt::llint_link_call): Deleted. * Source/JavaScriptCore/llint/LLIntSlowPaths.h: * Source/JavaScriptCore/llint/LLIntThunks.cpp: (JSC::LLInt::defaultCallThunk): * Source/JavaScriptCore/llint/LLIntThunks.h: * Source/JavaScriptCore/llint/LowLevelInterpreter.asm: * Source/JavaScriptCore/llint/LowLevelInterpreter.cpp: (JSC::CLoop::execute): * Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm: * Source/JavaScriptCore/llint/LowLevelInterpreter64.asm: * Source/JavaScriptCore/offlineasm/cloop.rb: * Source/JavaScriptCore/runtime/AggregateError.cpp: (JSC::createAggregateError): * Source/JavaScriptCore/runtime/ArityCheckMode.h: * Source/JavaScriptCore/runtime/Error.cpp: (JSC::createError): (JSC::createEvalError): (JSC::createRangeError): (JSC::createReferenceError): (JSC::createSyntaxError): (JSC::createTypeError): (JSC::createURIError): (JSC::createGetterTypeError): (JSC::getStackTrace): (JSC::getBytecodeIndex): (JSC::addErrorInfo): * Source/JavaScriptCore/runtime/Error.h: * Source/JavaScriptCore/runtime/ErrorInstance.cpp: (JSC::ErrorInstance::create): (JSC::appendSourceToErrorMessage): (JSC::ErrorInstance::finishCreation): * Source/JavaScriptCore/runtime/ErrorInstance.h: (JSC::ErrorInstance::create): * Source/JavaScriptCore/runtime/ExceptionHelpers.cpp: (JSC::notAFunctionSourceAppender): (JSC::constructErrorMessage): (JSC::createError): * Source/JavaScriptCore/runtime/ExceptionHelpers.h: * Source/JavaScriptCore/runtime/Gate.h: * Source/JavaScriptCore/runtime/JSCConfig.h: * Source/JavaScriptCore/runtime/NullSetterFunction.cpp: (JSC::NullSetterFunctionInternal::JSC_DEFINE_HOST_FUNCTION): * Source/JavaScriptCore/runtime/Options.cpp: (JSC::Options::notifyOptionsChanged): * Source/JavaScriptCore/runtime/ScriptExecutable.cpp: (JSC::ScriptExecutable::installCode): * Source/JavaScriptCore/runtime/StackFrame.cpp: (JSC::StackFrame::StackFrame): (JSC::StackFrame::functionName const): * Source/JavaScriptCore/runtime/StackFrame.h: * Source/JavaScriptCore/runtime/VM.cpp: (JSC::VM::getCTILinkCall): Deleted. * Source/JavaScriptCore/runtime/VM.h: * Source/JavaScriptCore/wasm/js/JSWebAssemblyCompileError.cpp: (JSC::createJSWebAssemblyCompileError): * Source/JavaScriptCore/wasm/js/JSWebAssemblyLinkError.cpp: (JSC::createJSWebAssemblyLinkError): * Source/JavaScriptCore/wasm/js/JSWebAssemblyModule.cpp: (JSC::JSWebAssemblyModule::clearJSCallICs): * Source/JavaScriptCore/wasm/js/JSWebAssemblyRuntimeError.cpp: (JSC::createJSWebAssemblyRuntimeError): * Source/JavaScriptCore/wasm/js/WasmToJS.cpp: (JSC::Wasm::wasmToJS): Canonical link: https://commits.webkit.org/273190@main
- Loading branch information