Changeset 271422 in webkit
- Timestamp:
- Jan 12, 2021, 4:09:16 PM (6 years ago)
- Location:
- trunk
- Files:
-
- 1 added
- 8 edited
-
JSTests/ChangeLog (modified) (1 diff)
-
JSTests/stress/domjit-getter2.js (added)
-
Source/JavaScriptCore/ChangeLog (modified) (1 diff)
-
Source/JavaScriptCore/dfg/DFGJITCompiler.h (modified) (1 diff)
-
Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp (modified) (1 diff)
-
Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h (modified) (1 diff)
-
Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp (modified) (2 diffs)
-
Source/JavaScriptCore/ftl/FTLOutput.h (modified) (1 diff)
-
Source/JavaScriptCore/tools/JSDollarVM.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/JSTests/ChangeLog
r271420 r271422 1 2021-01-12 Yusuke Suzuki <ysuzuki@apple.com> 2 3 [JSC] Bypass OperationPtrTagging for JITCage verification for CallDOMGetter 4 https://bugs.webkit.org/show_bug.cgi?id=220564 5 6 Reviewed by Saam Barati. 7 8 * stress/domjit-getter2.js: Added. 9 (shouldBe): 10 (access): 11 1 12 2021-01-12 Caio Lima <ticaiolima@gmail.com> 2 13 -
trunk/Source/JavaScriptCore/ChangeLog
r271420 r271422 1 2021-01-12 Yusuke Suzuki <ysuzuki@apple.com> 2 3 [JSC] Bypass OperationPtrTagging for JITCage verification for CallDOMGetter 4 https://bugs.webkit.org/show_bug.cgi?id=220564 5 6 Reviewed by Saam Barati. 7 8 CustomAccessorPtrTag functions are not registered ones for JITCage since we are using C++ trampoline to invoke them. 9 However, we do not want to use this trampoline in x64 due to performance issue. So we would like to call these 10 functions directly from JIT while they are not registered (And this is OK in JITCage since they are called from trampoline). 11 In this patch we bypass OperationPtrTagging by using WTF::tagNativeCodePtrImpl directly for non JITCage case. 12 13 * dfg/DFGJITCompiler.h: 14 (JSC::DFG::JITCompiler::appendOperationCall): 15 * dfg/DFGSpeculativeJIT.cpp: 16 (JSC::DFG::SpeculativeJIT::compileCallDOMGetter): 17 * dfg/DFGSpeculativeJIT.h: 18 (JSC::DFG::SpeculativeJIT::appendOperationCall): 19 * ftl/FTLLowerDFGToB3.cpp: 20 (JSC::FTL::DFG::LowerDFGToB3::compileCallDOMGetter): 21 (JSC::FTL::DFG::LowerDFGToB3::vmCall): 22 * ftl/FTLOutput.h: 23 (JSC::FTL::Output::operation): 24 * tools/JSDollarVM.cpp: 25 1 26 2021-01-12 Caio Lima <ticaiolima@gmail.com> 2 27 -
trunk/Source/JavaScriptCore/dfg/DFGJITCompiler.h
r262920 r271422 146 146 return functionCall; 147 147 } 148 149 Call appendOperationCall(const FunctionPtr<OperationPtrTag> function) 150 { 151 Call functionCall = call(OperationPtrTag); 152 m_calls.append(CallLinkRecord(functionCall, function)); 153 return functionCall; 154 } 148 155 149 156 void exceptionCheck(); -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
r270874 r271422 10123 10123 if (Options::useJITCage()) 10124 10124 m_jit.appendCall(vmEntryCustomAccessor); 10125 else 10126 m_jit.appendCall(getter.retagged<CFunctionPtrTag>()); 10125 else { 10126 FunctionPtr<OperationPtrTag> bypassedFunction = FunctionPtr<OperationPtrTag>(MacroAssemblerCodePtr<OperationPtrTag>(WTF::tagNativeCodePtrImpl<OperationPtrTag>(WTF::untagNativeCodePtrImpl<CustomAccessorPtrTag>(getter.executableAddress())))); 10127 m_jit.appendOperationCall(bypassedFunction); 10128 } 10127 10129 m_jit.setupResults(resultRegs); 10128 10130 -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h
r270874 r271422 985 985 m_jit.emitStoreCodeOrigin(m_currentNode->origin.semantic); 986 986 return m_jit.appendCall(function); 987 } 988 989 JITCompiler::Call appendOperationCall(const FunctionPtr<OperationPtrTag> function) 990 { 991 prepareForExternalCall(); 992 m_jit.emitStoreCodeOrigin(m_currentNode->origin.semantic); 993 return m_jit.appendOperationCall(function); 987 994 } 988 995 -
trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp
r271226 r271422 14507 14507 vmCall(Int64, vmEntryCustomAccessor, weakPointer(globalObject), lowCell(m_node->child1()), m_out.constIntPtr(m_graph.identifiers()[m_node->callDOMGetterData()->identifierNumber]), m_out.constIntPtr(m_node->callDOMGetterData()->customAccessorGetter.executableAddress()))); 14508 14508 } else { 14509 setJSValue(14510 vmCall(Int64, bitwise_cast<CustomGetterSetter::CustomGetter>(m_node->callDOMGetterData()->customAccessorGetter.retaggedExecutableAddress<CFunctionPtrTag>()),14511 weakPointer(globalObject), lowCell(m_node->child1()), m_out.constIntPtr(m_graph.identifiers()[m_node->callDOMGetterData()->identifierNumber])));14509 FunctionPtr<CustomAccessorPtrTag> getter = m_node->callDOMGetterData()->customAccessorGetter; 14510 FunctionPtr<OperationPtrTag> bypassedFunction = FunctionPtr<OperationPtrTag>(MacroAssemblerCodePtr<OperationPtrTag>(WTF::tagNativeCodePtrImpl<OperationPtrTag>(WTF::untagNativeCodePtrImpl<CustomAccessorPtrTag>(getter.executableAddress())))); 14511 setJSValue(vmCall(Int64, bypassedFunction, weakPointer(globalObject), lowCell(m_node->child1()), m_out.constIntPtr(m_graph.identifiers()[m_node->callDOMGetterData()->identifierNumber]))); 14512 14512 } 14513 14513 return; … … 19104 19104 { 19105 19105 static_assert(!std::is_same<OperationType, LValue>::value); 19106 static_assert(FunctionTraits<OperationType>::cCallArity() == sizeof...(Args), "Sanity check"); 19106 if constexpr (!std::is_same_v<FunctionPtr<OperationPtrTag>, OperationType>) 19107 static_assert(FunctionTraits<OperationType>::cCallArity() == sizeof...(Args), "Sanity check"); 19107 19108 callPreflight(); 19108 19109 LValue result = m_out.call(type, m_out.operation(function), std::forward<Args>(args)...); -
trunk/Source/JavaScriptCore/ftl/FTLOutput.h
r268247 r271422 403 403 template<typename FunctionType> 404 404 LValue operation(FunctionType function) { return constIntPtr(tagCFunctionPtr<void*, OperationPtrTag>(function)); } 405 LValue operation(FunctionPtr<OperationPtrTag> function) { return constIntPtr(function.executableAddress()); } 405 406 406 407 void jump(LBasicBlock); -
trunk/Source/JavaScriptCore/tools/JSDollarVM.cpp
r271269 r271422 988 988 DollarVMAssertScope assertScope; 989 989 Base::finishCreation(vm); 990 const DOMJIT::GetterSetter* domJIT = &DOMJITGetterDOMJIT; 991 auto* customGetterSetter = DOMAttributeGetterSetter::create(vm, domJIT->getter(), nullptr, DOMAttributeAnnotation { DOMJITNode::info(), domJIT }); 992 putDirectCustomAccessor(vm, Identifier::fromString(vm, "customGetter"), customGetterSetter, PropertyAttribute::ReadOnly | PropertyAttribute::CustomAccessor); 990 { 991 const DOMJIT::GetterSetter* domJIT = &DOMJITGetterDOMJIT; 992 auto* customGetterSetter = DOMAttributeGetterSetter::create(vm, domJIT->getter(), nullptr, DOMAttributeAnnotation { DOMJITNode::info(), domJIT }); 993 putDirectCustomAccessor(vm, Identifier::fromString(vm, "customGetter"), customGetterSetter, PropertyAttribute::ReadOnly | PropertyAttribute::CustomAccessor); 994 } 995 { 996 auto* customGetterSetter = DOMAttributeGetterSetter::create(vm, domJITGetterCustomGetter, nullptr, DOMAttributeAnnotation { DOMJITNode::info(), nullptr }); 997 putDirectCustomAccessor(vm, Identifier::fromString(vm, "customGetter2"), customGetterSetter, PropertyAttribute::ReadOnly | PropertyAttribute::CustomAccessor); 998 } 993 999 } 994 1000
Note:
See TracChangeset
for help on using the changeset viewer.