Changeset 223866 in webkit
- Timestamp:
- Oct 23, 2017 5:29:40 PM (6 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 19 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r223856 r223866 1 2017-10-23 JF Bastien <jfbastien@apple.com> 2 3 WebAssembly: topEntryFrame on Wasm::Instance 4 https://bugs.webkit.org/show_bug.cgi?id=178690 5 6 Reviewed by Saam Barati. 7 8 topEntryFrame is usually on VM, but for a no-VM WebAssembly we 9 need to hold topEntryFrame elsewhere, and generated code cannot 10 hard-code where topEntryFrame live. Do this at creation time of 11 Wasm::Instance, and then generated code will just load from 12 wherever Wasm::Instance was told topEntryFrame is. In a JavaScript 13 embedding this is still from VM, so all of the unwinding machinery 14 stays the same. 15 16 * dfg/DFGOSREntry.cpp: 17 (JSC::DFG::prepareOSREntry): 18 * dfg/DFGOSRExit.cpp: 19 (JSC::DFG::restoreCalleeSavesFromVMEntryFrameCalleeSavesBuffer): 20 (JSC::DFG::copyCalleeSavesToVMEntryFrameCalleeSavesBuffer): 21 * ftl/FTLOSRExitCompiler.cpp: 22 (JSC::FTL::compileStub): 23 * interpreter/Interpreter.cpp: 24 (JSC::UnwindFunctor::copyCalleeSavesToEntryFrameCalleeSavesBuffer const): 25 * jit/AssemblyHelpers.cpp: 26 (JSC::AssemblyHelpers::restoreCalleeSavesFromEntryFrameCalleeSavesBuffer): 27 (JSC::AssemblyHelpers::copyCalleeSavesToEntryFrameCalleeSavesBufferImpl): 28 * jit/AssemblyHelpers.h: 29 (JSC::AssemblyHelpers::copyCalleeSavesToEntryFrameCalleeSavesBuffer): 30 The default parameter was never non-defaulted from any of the 31 callers. The new version calls the impl directly because it 32 doesn't have VM and doesn't hard-code the address of 33 topEntryFrame. 34 * jit/RegisterSet.cpp: 35 (JSC::RegisterSet::vmCalleeSaveRegisterOffsets): This was weird on 36 VM because it's not really VM-specific. 37 * jit/RegisterSet.h: 38 * runtime/VM.cpp: 39 (JSC::VM::getAllCalleeSaveRegisterOffsets): Deleted. 40 * runtime/VM.h: 41 (JSC::VM::getCTIStub): 42 * wasm/WasmB3IRGenerator.cpp: 43 (JSC::Wasm::B3IRGenerator::B3IRGenerator): 44 (JSC::Wasm::B3IRGenerator::addCall): 45 (JSC::Wasm::B3IRGenerator::addCallIndirect): 46 * wasm/WasmInstance.cpp: 47 (JSC::Wasm::Instance::Instance): 48 * wasm/WasmInstance.h: topEntryFramePointer will eventually live 49 here for real. Right now it's mirrored in JSWebAssemblyInstance 50 because that's the acting Context. 51 (JSC::Wasm::Instance::create): 52 (JSC::Wasm::Instance::offsetOfTopEntryFramePointer): 53 * wasm/WasmThunks.cpp: 54 (JSC::Wasm::throwExceptionFromWasmThunkGenerator): 55 * wasm/js/JSWebAssemblyInstance.cpp: 56 (JSC::JSWebAssemblyInstance::JSWebAssemblyInstance): 57 * wasm/js/JSWebAssemblyInstance.h: Mirror Wasm::Instance temporarily. 58 (JSC::JSWebAssemblyInstance::offsetOfCallee): 59 (JSC::JSWebAssemblyInstance::offsetOfTopEntryFramePointer): 60 (JSC::JSWebAssemblyInstance::offsetOfVM): Deleted. 61 * wasm/js/WebAssemblyInstanceConstructor.cpp: 62 (JSC::constructJSWebAssemblyInstance): 63 * wasm/js/WebAssemblyPrototype.cpp: 64 (JSC::instantiate): 65 1 66 2017-10-23 Joseph Pecoraro <pecoraro@apple.com> 2 67 -
trunk/Source/JavaScriptCore/dfg/DFGOSREntry.cpp
r223738 r223866 314 314 #if NUMBER_OF_CALLEE_SAVES_REGISTERS > 0 315 315 RegisterAtOffsetList* registerSaveLocations = codeBlock->calleeSaveRegisters(); 316 RegisterAtOffsetList* allCalleeSaves = VM::getAllCalleeSaveRegisterOffsets();316 RegisterAtOffsetList* allCalleeSaves = RegisterSet::vmCalleeSaveRegisterOffsets(); 317 317 RegisterSet dontSaveRegisters = RegisterSet(RegisterSet::stackRegisters(), RegisterSet::allFPRs()); 318 318 -
trunk/Source/JavaScriptCore/dfg/DFGOSRExit.cpp
r223738 r223866 123 123 VM& vm = *context.arg<VM*>(); 124 124 125 RegisterAtOffsetList* allCalleeSaves = VM::getAllCalleeSaveRegisterOffsets();125 RegisterAtOffsetList* allCalleeSaves = RegisterSet::vmCalleeSaveRegisterOffsets(); 126 126 RegisterSet dontRestoreRegisters = RegisterSet::stackRegisters(); 127 127 unsigned registerCount = allCalleeSaves->size(); … … 152 152 void* calleeSaveBuffer = entryRecord->calleeSaveRegistersBuffer; 153 153 154 RegisterAtOffsetList* allCalleeSaves = VM::getAllCalleeSaveRegisterOffsets();154 RegisterAtOffsetList* allCalleeSaves = RegisterSet::vmCalleeSaveRegisterOffsets(); 155 155 RegisterSet dontCopyRegisters = RegisterSet::stackRegisters(); 156 156 unsigned registerCount = allCalleeSaves->size(); -
trunk/Source/JavaScriptCore/ftl/FTLOSRExitCompiler.cpp
r223738 r223866 410 410 RegisterSet allFTLCalleeSaves = RegisterSet::ftlCalleeSaveRegisters(); 411 411 RegisterAtOffsetList* baselineCalleeSaves = baselineCodeBlock->calleeSaveRegisters(); 412 RegisterAtOffsetList* vmCalleeSaves = VM::getAllCalleeSaveRegisterOffsets();412 RegisterAtOffsetList* vmCalleeSaves = RegisterSet::vmCalleeSaveRegisterOffsets(); 413 413 RegisterSet vmCalleeSavesToSkip = RegisterSet::stackRegisters(); 414 414 if (exit.isExceptionHandler()) { -
trunk/Source/JavaScriptCore/interpreter/Interpreter.cpp
r223738 r223866 672 672 return; 673 673 674 RegisterAtOffsetList* allCalleeSaves = VM::getAllCalleeSaveRegisterOffsets();674 RegisterAtOffsetList* allCalleeSaves = RegisterSet::vmCalleeSaveRegisterOffsets(); 675 675 RegisterSet dontCopyRegisters = RegisterSet::stackRegisters(); 676 676 intptr_t* frame = reinterpret_cast<intptr_t*>(m_callFrame->registers()); -
trunk/Source/JavaScriptCore/jit/AssemblyHelpers.cpp
r223738 r223866 586 586 { 587 587 #if NUMBER_OF_CALLEE_SAVES_REGISTERS > 0 588 RegisterAtOffsetList* allCalleeSaves = VM::getAllCalleeSaveRegisterOffsets();588 RegisterAtOffsetList* allCalleeSaves = RegisterSet::vmCalleeSaveRegisterOffsets(); 589 589 RegisterSet dontRestoreRegisters = RegisterSet::stackRegisters(); 590 590 unsigned registerCount = allCalleeSaves->size(); … … 881 881 addPtr(TrustedImm32(EntryFrame::calleeSaveRegistersBufferOffset()), calleeSavesBuffer); 882 882 883 RegisterAtOffsetList* allCalleeSaves = VM::getAllCalleeSaveRegisterOffsets();883 RegisterAtOffsetList* allCalleeSaves = RegisterSet::vmCalleeSaveRegisterOffsets(); 884 884 RegisterSet dontCopyRegisters = RegisterSet::stackRegisters(); 885 885 unsigned registerCount = allCalleeSaves->size(); -
trunk/Source/JavaScriptCore/jit/AssemblyHelpers.h
r223738 r223866 368 368 } 369 369 370 void copyCalleeSavesToEntryFrameCalleeSavesBuffer(EntryFrame*& topEntryFrame , const TempRegisterSet& usedRegisters = { RegisterSet::stubUnavailableRegisters() })370 void copyCalleeSavesToEntryFrameCalleeSavesBuffer(EntryFrame*& topEntryFrame) 371 371 { 372 372 #if NUMBER_OF_CALLEE_SAVES_REGISTERS > 0 373 const TempRegisterSet& usedRegisters = { RegisterSet::stubUnavailableRegisters() }; 373 374 GPRReg temp1 = usedRegisters.getFreeGPR(0); 374 375 loadPtr(&topEntryFrame, temp1); … … 376 377 #else 377 378 UNUSED_PARAM(topEntryFrame); 378 UNUSED_PARAM(usedRegisters); 379 #endif 380 } 381 382 void copyCalleeSavesToEntryFrameCalleeSavesBuffer(GPRReg topEntryFrame) 383 { 384 #if NUMBER_OF_CALLEE_SAVES_REGISTERS > 0 385 copyCalleeSavesToEntryFrameCalleeSavesBufferImpl(topEntryFrame); 386 #else 387 UNUSED_PARAM(topEntryFrame); 379 388 #endif 380 389 } … … 396 405 addPtr(TrustedImm32(EntryFrame::calleeSaveRegistersBufferOffset()), temp1); 397 406 398 RegisterAtOffsetList* allCalleeSaves = VM::getAllCalleeSaveRegisterOffsets();407 RegisterAtOffsetList* allCalleeSaves = RegisterSet::vmCalleeSaveRegisterOffsets(); 399 408 RegisterAtOffsetList* currentCalleeSaves = codeBlock()->calleeSaveRegisters(); 400 409 RegisterSet dontCopyRegisters = RegisterSet::stackRegisters(); -
trunk/Source/JavaScriptCore/jit/RegisterSet.cpp
r219740 r223866 30 30 31 31 #include "GPRInfo.h" 32 #include "JSCInlines.h" 32 33 #include "MacroAssembler.h" 33 #include " JSCInlines.h"34 #include "RegisterAtOffsetList.h" 34 35 #include <wtf/CommaPrinter.h> 35 36 … … 202 203 } 203 204 205 RegisterAtOffsetList* RegisterSet::vmCalleeSaveRegisterOffsets() 206 { 207 static RegisterAtOffsetList* result; 208 static std::once_flag calleeSavesFlag; 209 std::call_once(calleeSavesFlag, [] () { 210 result = new RegisterAtOffsetList(vmCalleeSaveRegisters(), RegisterAtOffsetList::ZeroBased); 211 }); 212 return result; 213 } 214 204 215 RegisterSet RegisterSet::llintBaselineCalleeSaveRegisters() 205 216 { -
trunk/Source/JavaScriptCore/jit/RegisterSet.h
r219633 r223866 37 37 38 38 typedef Bitmap<MacroAssembler::numGPRs + MacroAssembler::numFPRs + 1> RegisterBitmap; 39 class RegisterAtOffsetList; 39 40 40 41 class RegisterSet { … … 52 53 JS_EXPORT_PRIVATE static RegisterSet calleeSaveRegisters(); 53 54 static RegisterSet vmCalleeSaveRegisters(); // Callee save registers that might be saved and used by any tier. 55 static RegisterAtOffsetList* vmCalleeSaveRegisterOffsets(); 54 56 static RegisterSet llintBaselineCalleeSaveRegisters(); // Registers saved and used by the LLInt. 55 57 static RegisterSet dfgCalleeSaveRegisters(); // Registers saved and used by the DFG JIT. -
trunk/Source/JavaScriptCore/runtime/VM.cpp
r223738 r223866 997 997 #endif 998 998 999 #if ENABLE(JIT)1000 RegisterAtOffsetList* VM::getAllCalleeSaveRegisterOffsets()1001 {1002 static RegisterAtOffsetList* result;1003 1004 static std::once_flag calleeSavesFlag;1005 std::call_once(calleeSavesFlag, [] () {1006 result = new RegisterAtOffsetList(RegisterSet::vmCalleeSaveRegisters(), RegisterAtOffsetList::ZeroBased);1007 });1008 1009 return result;1010 }1011 #endif // ENABLE(JIT)1012 1013 999 #if USE(CF) 1014 1000 void VM::registerRunLoopTimer(JSRunLoopTimer* timer) -
trunk/Source/JavaScriptCore/runtime/VM.h
r223738 r223866 479 479 return jitStubs->ctiStub(this, generator); 480 480 } 481 482 static RegisterAtOffsetList* getAllCalleeSaveRegisterOffsets();483 481 484 482 #endif // ENABLE(JIT) -
trunk/Source/JavaScriptCore/wasm/WasmB3IRGenerator.cpp
r223738 r223866 407 407 // 2. Try to speed things up by skipping stack checks. 408 408 minimumParentCheckSize, 409 // This allows us to elide stack checks in the Wasm -> JScall IC stub. Since these will409 // This allows us to elide stack checks in the Wasm -> Embedder call IC stub. Since these will 410 410 // spill all arguments to the stack, we ensure that a stack check here covers the 411 411 // stack that such a stub would use. … … 1110 1110 1111 1111 // FIXME: Let's remove this indirection by creating a PIC friendly IC 1112 // for calls out to JS. This shouldn't be that hard to do. We could probably1112 // for calls out to the embedder. This shouldn't be that hard to do. We could probably 1113 1113 // implement the IC to be over Context*. 1114 1114 // https://bugs.webkit.org/show_bug.cgi?id=170375 … … 1170 1170 m_makesCalls = true; 1171 1171 // Note: call indirect can call either WebAssemblyFunction or WebAssemblyWrapperFunction. Because 1172 // WebAssemblyWrapperFunction is like calling into JS, we conservatively assume all call indirects1173 // can be to JSfor our stack check calculation.1172 // WebAssemblyWrapperFunction is like calling into the embedder, we conservatively assume all call indirects 1173 // can be to the embedder for our stack check calculation. 1174 1174 m_maxNumJSCallArguments = std::max(m_maxNumJSCallArguments, static_cast<uint32_t>(args.size())); 1175 1175 -
trunk/Source/JavaScriptCore/wasm/WasmInstance.cpp
r223738 r223866 41 41 } 42 42 43 Instance::Instance(Ref<Module>&& module )43 Instance::Instance(Ref<Module>&& module, EntryFrame** topEntryFramePointer) 44 44 : m_module(WTFMove(module)) 45 45 , m_globals(MallocPtr<uint64_t>::malloc(globalMemoryByteSize(m_module.get()))) 46 , m_topEntryFramePointer(topEntryFramePointer) 46 47 { 47 48 } -
trunk/Source/JavaScriptCore/wasm/WasmInstance.h
r223738 r223866 41 41 class Instance : public ThreadSafeRefCounted<Instance> { 42 42 public: 43 static Ref<Instance> create(Ref<Module>&& module )43 static Ref<Instance> create(Ref<Module>&& module, EntryFrame** topEntryFramePointer) 44 44 { 45 return adoptRef(*new Instance(WTFMove(module) ));45 return adoptRef(*new Instance(WTFMove(module), topEntryFramePointer)); 46 46 } 47 47 … … 66 66 void setGlobal(unsigned i, int64_t bits) { m_globals.get()[i] = bits; } 67 67 68 static ptrdiff_t offsetOfTopEntryFramePointer() { return OBJECT_OFFSETOF(Instance, m_topEntryFramePointer); } 69 68 70 static ptrdiff_t offsetOfCachedStackLimit() { return OBJECT_OFFSETOF(Instance, m_cachedStackLimit); } 69 71 void* cachedStackLimit() const { return m_cachedStackLimit; } … … 73 75 74 76 private: 75 Instance(Ref<Module>&& );77 Instance(Ref<Module>&&, EntryFrame**); 76 78 77 79 Ref<Module> m_module; … … 80 82 RefPtr<Table> m_table; 81 83 MallocPtr<uint64_t> m_globals; 84 EntryFrame** m_topEntryFramePointer { nullptr }; 82 85 void* m_cachedStackLimit { bitwise_cast<void*>(std::numeric_limits<uintptr_t>::max()) }; 83 86 }; -
trunk/Source/JavaScriptCore/wasm/WasmThunks.cpp
r223738 r223866 48 48 // We're allowed to use temp registers here. We are not allowed to use callee saves. 49 49 jit.loadWasmContextInstance(GPRInfo::argumentGPR2); 50 jit.loadPtr(CCallHelpers::Address(GPRInfo::argumentGPR2, JSWebAssemblyInstance::offsetOfVM()), GPRInfo::argumentGPR0); 51 jit.copyCalleeSavesToVMEntryFrameCalleeSavesBuffer(GPRInfo::argumentGPR0); 50 jit.loadPtr(CCallHelpers::Address(GPRInfo::argumentGPR2, JSWebAssemblyInstance::offsetOfTopEntryFramePointer()), GPRInfo::argumentGPR0); 51 jit.loadPtr(CCallHelpers::Address(GPRInfo::argumentGPR0), GPRInfo::argumentGPR0); 52 jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(GPRInfo::argumentGPR0); 52 53 jit.move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); 53 54 CCallHelpers::Call call = jit.call(); -
trunk/Source/JavaScriptCore/wasm/js/JSWebAssemblyInstance.cpp
r223738 r223866 57 57 , m_wasmTable(m_instance->m_table.get()) 58 58 , m_globals(m_instance->m_globals.get()) 59 , m_topEntryFramePointer(m_instance->m_topEntryFramePointer) 59 60 , m_numImportFunctions(numImportFunctions) 60 61 { -
trunk/Source/JavaScriptCore/wasm/js/JSWebAssemblyInstance.h
r223738 r223866 93 93 static ptrdiff_t offsetOfWasmTable() { return OBJECT_OFFSETOF(JSWebAssemblyInstance, m_wasmTable); } 94 94 static ptrdiff_t offsetOfCallee() { return OBJECT_OFFSETOF(JSWebAssemblyInstance, m_callee); } 95 static ptrdiff_t offsetOfVM() { return OBJECT_OFFSETOF(JSWebAssemblyInstance, m_vm); }96 95 static ptrdiff_t offsetOfGlobals() { return OBJECT_OFFSETOF(JSWebAssemblyInstance, m_globals); } 97 96 static ptrdiff_t offsetOfCodeBlock() { return OBJECT_OFFSETOF(JSWebAssemblyInstance, m_codeBlock); } … … 99 98 static ptrdiff_t offsetOfCachedStackLimit() { return OBJECT_OFFSETOF(JSWebAssemblyInstance, m_cachedStackLimit); } 100 99 static ptrdiff_t offsetOfWasmMemory() { return OBJECT_OFFSETOF(JSWebAssemblyInstance, m_wasmMemory); } 100 static ptrdiff_t offsetOfTopEntryFramePointer() { return OBJECT_OFFSETOF(JSWebAssemblyInstance, m_topEntryFramePointer); } 101 101 void* cachedStackLimit() const { RELEASE_ASSERT(m_instance->cachedStackLimit() == m_cachedStackLimit); return m_cachedStackLimit; } 102 102 void setCachedStackLimit(void* limit) { m_instance->setCachedStackLimit(limit); m_cachedStackLimit = limit; } … … 135 135 Wasm::Table* m_wasmTable { nullptr }; 136 136 uint64_t* m_globals { nullptr }; 137 EntryFrame** m_topEntryFramePointer { nullptr }; 137 138 138 139 unsigned m_numImportFunctions; -
trunk/Source/JavaScriptCore/wasm/js/WebAssemblyInstanceConstructor.cpp
r223738 r223866 78 78 RETURN_IF_EXCEPTION(scope, { }); 79 79 80 JSWebAssemblyInstance* instance = JSWebAssemblyInstance::create(vm, exec, module, importObject, instanceStructure, Wasm::Instance::create(Ref<Wasm::Module>(module->module()) ));80 JSWebAssemblyInstance* instance = JSWebAssemblyInstance::create(vm, exec, module, importObject, instanceStructure, Wasm::Instance::create(Ref<Wasm::Module>(module->module()), &vm.topEntryFrame)); 81 81 RETURN_IF_EXCEPTION(scope, { }); 82 82 -
trunk/Source/JavaScriptCore/wasm/js/WebAssemblyPrototype.cpp
r223738 r223866 138 138 auto scope = DECLARE_CATCH_SCOPE(vm); 139 139 // In order to avoid potentially recompiling a module. We first gather all the import/memory information prior to compiling code. 140 JSWebAssemblyInstance* instance = JSWebAssemblyInstance::create(vm, exec, module, importObject, exec->lexicalGlobalObject()->WebAssemblyInstanceStructure(), Wasm::Instance::create(Ref<Wasm::Module>(module->module()) ));140 JSWebAssemblyInstance* instance = JSWebAssemblyInstance::create(vm, exec, module, importObject, exec->lexicalGlobalObject()->WebAssemblyInstanceStructure(), Wasm::Instance::create(Ref<Wasm::Module>(module->module()), &vm.topEntryFrame)); 141 141 RETURN_IF_EXCEPTION(scope, reject(exec, scope, promise)); 142 142
Note: See TracChangeset
for help on using the changeset viewer.