Changeset 223875 in webkit


Ignore:
Timestamp:
Oct 23, 2017 8:20:31 PM (7 years ago)
Author:
keith_miller@apple.com
Message:

Unreviewed, reland r223866

Didn't break the windows build...

Restored changeset:

"WebAssembly: topEntryFrame on Wasm::Instance"
https://bugs.webkit.org/show_bug.cgi?id=178690
https://trac.webkit.org/changeset/223866

Location:
trunk/Source/JavaScriptCore
Files:
19 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r223874 r223875  
     12017-10-23  Keith Miller  <keith_miller@apple.com>
     2
     3        Unreviewed, reland r223866
     4
     5        Didn't break the windows build...
     6
     7        Restored changeset:
     8
     9        "WebAssembly: topEntryFrame on Wasm::Instance"
     10        https://bugs.webkit.org/show_bug.cgi?id=178690
     11        https://trac.webkit.org/changeset/223866
     12
     13
    1142017-10-23  Commit Queue  <commit-queue@webkit.org>
    215
  • trunk/Source/JavaScriptCore/dfg/DFGOSREntry.cpp

    r223874 r223875  
    314314#if NUMBER_OF_CALLEE_SAVES_REGISTERS > 0
    315315    RegisterAtOffsetList* registerSaveLocations = codeBlock->calleeSaveRegisters();
    316     RegisterAtOffsetList* allCalleeSaves = VM::getAllCalleeSaveRegisterOffsets();
     316    RegisterAtOffsetList* allCalleeSaves = RegisterSet::vmCalleeSaveRegisterOffsets();
    317317    RegisterSet dontSaveRegisters = RegisterSet(RegisterSet::stackRegisters(), RegisterSet::allFPRs());
    318318
  • trunk/Source/JavaScriptCore/dfg/DFGOSRExit.cpp

    r223874 r223875  
    123123    VM& vm = *context.arg<VM*>();
    124124
    125     RegisterAtOffsetList* allCalleeSaves = VM::getAllCalleeSaveRegisterOffsets();
     125    RegisterAtOffsetList* allCalleeSaves = RegisterSet::vmCalleeSaveRegisterOffsets();
    126126    RegisterSet dontRestoreRegisters = RegisterSet::stackRegisters();
    127127    unsigned registerCount = allCalleeSaves->size();
     
    152152    void* calleeSaveBuffer = entryRecord->calleeSaveRegistersBuffer;
    153153
    154     RegisterAtOffsetList* allCalleeSaves = VM::getAllCalleeSaveRegisterOffsets();
     154    RegisterAtOffsetList* allCalleeSaves = RegisterSet::vmCalleeSaveRegisterOffsets();
    155155    RegisterSet dontCopyRegisters = RegisterSet::stackRegisters();
    156156    unsigned registerCount = allCalleeSaves->size();
  • trunk/Source/JavaScriptCore/ftl/FTLOSRExitCompiler.cpp

    r223874 r223875  
    410410    RegisterSet allFTLCalleeSaves = RegisterSet::ftlCalleeSaveRegisters();
    411411    RegisterAtOffsetList* baselineCalleeSaves = baselineCodeBlock->calleeSaveRegisters();
    412     RegisterAtOffsetList* vmCalleeSaves = VM::getAllCalleeSaveRegisterOffsets();
     412    RegisterAtOffsetList* vmCalleeSaves = RegisterSet::vmCalleeSaveRegisterOffsets();
    413413    RegisterSet vmCalleeSavesToSkip = RegisterSet::stackRegisters();
    414414    if (exit.isExceptionHandler()) {
  • trunk/Source/JavaScriptCore/interpreter/Interpreter.cpp

    r223874 r223875  
    672672            return;
    673673
    674         RegisterAtOffsetList* allCalleeSaves = VM::getAllCalleeSaveRegisterOffsets();
     674        RegisterAtOffsetList* allCalleeSaves = RegisterSet::vmCalleeSaveRegisterOffsets();
    675675        RegisterSet dontCopyRegisters = RegisterSet::stackRegisters();
    676676        intptr_t* frame = reinterpret_cast<intptr_t*>(m_callFrame->registers());
  • trunk/Source/JavaScriptCore/jit/AssemblyHelpers.cpp

    r223874 r223875  
    586586{
    587587#if NUMBER_OF_CALLEE_SAVES_REGISTERS > 0
    588     RegisterAtOffsetList* allCalleeSaves = VM::getAllCalleeSaveRegisterOffsets();
     588    RegisterAtOffsetList* allCalleeSaves = RegisterSet::vmCalleeSaveRegisterOffsets();
    589589    RegisterSet dontRestoreRegisters = RegisterSet::stackRegisters();
    590590    unsigned registerCount = allCalleeSaves->size();
     
    881881    addPtr(TrustedImm32(EntryFrame::calleeSaveRegistersBufferOffset()), calleeSavesBuffer);
    882882
    883     RegisterAtOffsetList* allCalleeSaves = VM::getAllCalleeSaveRegisterOffsets();
     883    RegisterAtOffsetList* allCalleeSaves = RegisterSet::vmCalleeSaveRegisterOffsets();
    884884    RegisterSet dontCopyRegisters = RegisterSet::stackRegisters();
    885885    unsigned registerCount = allCalleeSaves->size();
  • trunk/Source/JavaScriptCore/jit/AssemblyHelpers.h

    r223874 r223875  
    368368    }
    369369
    370     void copyCalleeSavesToEntryFrameCalleeSavesBuffer(EntryFrame*& topEntryFrame, const TempRegisterSet& usedRegisters = { RegisterSet::stubUnavailableRegisters() })
     370    void copyCalleeSavesToEntryFrameCalleeSavesBuffer(EntryFrame*& topEntryFrame)
    371371    {
    372372#if NUMBER_OF_CALLEE_SAVES_REGISTERS > 0
     373        const TempRegisterSet& usedRegisters = { RegisterSet::stubUnavailableRegisters() };
    373374        GPRReg temp1 = usedRegisters.getFreeGPR(0);
    374375        loadPtr(&topEntryFrame, temp1);
     
    376377#else
    377378        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);
    379388#endif
    380389    }
     
    396405        addPtr(TrustedImm32(EntryFrame::calleeSaveRegistersBufferOffset()), temp1);
    397406
    398         RegisterAtOffsetList* allCalleeSaves = VM::getAllCalleeSaveRegisterOffsets();
     407        RegisterAtOffsetList* allCalleeSaves = RegisterSet::vmCalleeSaveRegisterOffsets();
    399408        RegisterAtOffsetList* currentCalleeSaves = codeBlock()->calleeSaveRegisters();
    400409        RegisterSet dontCopyRegisters = RegisterSet::stackRegisters();
  • trunk/Source/JavaScriptCore/jit/RegisterSet.cpp

    r223874 r223875  
    3030
    3131#include "GPRInfo.h"
     32#include "JSCInlines.h"
    3233#include "MacroAssembler.h"
    33 #include "JSCInlines.h"
     34#include "RegisterAtOffsetList.h"
    3435#include <wtf/CommaPrinter.h>
    3536
     
    202203}
    203204
     205RegisterAtOffsetList* 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
    204215RegisterSet RegisterSet::llintBaselineCalleeSaveRegisters()
    205216{
  • trunk/Source/JavaScriptCore/jit/RegisterSet.h

    r223874 r223875  
    3737
    3838typedef Bitmap<MacroAssembler::numGPRs + MacroAssembler::numFPRs + 1> RegisterBitmap;
     39class RegisterAtOffsetList;
    3940
    4041class RegisterSet {
     
    5253    JS_EXPORT_PRIVATE static RegisterSet calleeSaveRegisters();
    5354    static RegisterSet vmCalleeSaveRegisters(); // Callee save registers that might be saved and used by any tier.
     55    static RegisterAtOffsetList* vmCalleeSaveRegisterOffsets();
    5456    static RegisterSet llintBaselineCalleeSaveRegisters(); // Registers saved and used by the LLInt.
    5557    static RegisterSet dfgCalleeSaveRegisters(); // Registers saved and used by the DFG JIT.
  • trunk/Source/JavaScriptCore/runtime/VM.cpp

    r223874 r223875  
    997997#endif
    998998
    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 
    1013999#if USE(CF)
    10141000void VM::registerRunLoopTimer(JSRunLoopTimer* timer)
  • trunk/Source/JavaScriptCore/runtime/VM.h

    r223874 r223875  
    479479        return jitStubs->ctiStub(this, generator);
    480480    }
    481    
    482     static RegisterAtOffsetList* getAllCalleeSaveRegisterOffsets();
    483481
    484482#endif // ENABLE(JIT)
  • trunk/Source/JavaScriptCore/wasm/WasmB3IRGenerator.cpp

    r223874 r223875  
    407407                // 2. Try to speed things up by skipping stack checks.
    408408                minimumParentCheckSize,
    409                 // This allows us to elide stack checks in the Wasm -> JS call IC stub. Since these will
     409                // This allows us to elide stack checks in the Wasm -> Embedder call IC stub. Since these will
    410410                // spill all arguments to the stack, we ensure that a stack check here covers the
    411411                // stack that such a stub would use.
     
    11101110
    11111111        // 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 probably
     1112        // for calls out to the embedder. This shouldn't be that hard to do. We could probably
    11131113        // implement the IC to be over Context*.
    11141114        // https://bugs.webkit.org/show_bug.cgi?id=170375
     
    11701170    m_makesCalls = true;
    11711171    // Note: call indirect can call either WebAssemblyFunction or WebAssemblyWrapperFunction. Because
    1172     // WebAssemblyWrapperFunction is like calling into JS, we conservatively assume all call indirects
    1173     // can be to JS for 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.
    11741174    m_maxNumJSCallArguments = std::max(m_maxNumJSCallArguments, static_cast<uint32_t>(args.size()));
    11751175
  • trunk/Source/JavaScriptCore/wasm/WasmInstance.cpp

    r223874 r223875  
    4141}
    4242
    43 Instance::Instance(Ref<Module>&& module)
     43Instance::Instance(Ref<Module>&& module, EntryFrame** topEntryFramePointer)
    4444    : m_module(WTFMove(module))
    4545    , m_globals(MallocPtr<uint64_t>::malloc(globalMemoryByteSize(m_module.get())))
     46    , m_topEntryFramePointer(topEntryFramePointer)
    4647{
    4748}
  • trunk/Source/JavaScriptCore/wasm/WasmInstance.h

    r223874 r223875  
    4141class Instance : public ThreadSafeRefCounted<Instance> {
    4242public:
    43     static Ref<Instance> create(Ref<Module>&& module)
     43    static Ref<Instance> create(Ref<Module>&& module, EntryFrame** topEntryFramePointer)
    4444    {
    45         return adoptRef(*new Instance(WTFMove(module)));
     45        return adoptRef(*new Instance(WTFMove(module), topEntryFramePointer));
    4646    }
    4747
     
    6666    void setGlobal(unsigned i, int64_t bits) { m_globals.get()[i] = bits; }
    6767
     68    static ptrdiff_t offsetOfTopEntryFramePointer() { return OBJECT_OFFSETOF(Instance, m_topEntryFramePointer); }
     69
    6870    static ptrdiff_t offsetOfCachedStackLimit() { return OBJECT_OFFSETOF(Instance, m_cachedStackLimit); }
    6971    void* cachedStackLimit() const { return m_cachedStackLimit; }
     
    7375
    7476private:
    75     Instance(Ref<Module>&&);
     77    Instance(Ref<Module>&&, EntryFrame**);
    7678
    7779    Ref<Module> m_module;
     
    8082    RefPtr<Table> m_table;
    8183    MallocPtr<uint64_t> m_globals;
     84    EntryFrame** m_topEntryFramePointer { nullptr };
    8285    void* m_cachedStackLimit { bitwise_cast<void*>(std::numeric_limits<uintptr_t>::max()) };
    8386};
  • trunk/Source/JavaScriptCore/wasm/WasmThunks.cpp

    r223874 r223875  
    4848    // We're allowed to use temp registers here. We are not allowed to use callee saves.
    4949    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);
    5253    jit.move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0);
    5354    CCallHelpers::Call call = jit.call();
  • trunk/Source/JavaScriptCore/wasm/js/JSWebAssemblyInstance.cpp

    r223874 r223875  
    5757    , m_wasmTable(m_instance->m_table.get())
    5858    , m_globals(m_instance->m_globals.get())
     59    , m_topEntryFramePointer(m_instance->m_topEntryFramePointer)
    5960    , m_numImportFunctions(numImportFunctions)
    6061{
  • trunk/Source/JavaScriptCore/wasm/js/JSWebAssemblyInstance.h

    r223874 r223875  
    9393    static ptrdiff_t offsetOfWasmTable() { return OBJECT_OFFSETOF(JSWebAssemblyInstance, m_wasmTable); }
    9494    static ptrdiff_t offsetOfCallee() { return OBJECT_OFFSETOF(JSWebAssemblyInstance, m_callee); }
    95     static ptrdiff_t offsetOfVM() { return OBJECT_OFFSETOF(JSWebAssemblyInstance, m_vm); }
    9695    static ptrdiff_t offsetOfGlobals() { return OBJECT_OFFSETOF(JSWebAssemblyInstance, m_globals); }
    9796    static ptrdiff_t offsetOfCodeBlock() { return OBJECT_OFFSETOF(JSWebAssemblyInstance, m_codeBlock); }
     
    9998    static ptrdiff_t offsetOfCachedStackLimit() { return OBJECT_OFFSETOF(JSWebAssemblyInstance, m_cachedStackLimit); }
    10099    static ptrdiff_t offsetOfWasmMemory() { return OBJECT_OFFSETOF(JSWebAssemblyInstance, m_wasmMemory); }
     100    static ptrdiff_t offsetOfTopEntryFramePointer() { return OBJECT_OFFSETOF(JSWebAssemblyInstance, m_topEntryFramePointer); }
    101101    void* cachedStackLimit() const { RELEASE_ASSERT(m_instance->cachedStackLimit() == m_cachedStackLimit); return m_cachedStackLimit; }
    102102    void setCachedStackLimit(void* limit) { m_instance->setCachedStackLimit(limit); m_cachedStackLimit = limit; }
     
    135135    Wasm::Table* m_wasmTable { nullptr };
    136136    uint64_t* m_globals { nullptr };
     137    EntryFrame** m_topEntryFramePointer { nullptr };
    137138
    138139    unsigned m_numImportFunctions;
  • trunk/Source/JavaScriptCore/wasm/js/WebAssemblyInstanceConstructor.cpp

    r223874 r223875  
    7878    RETURN_IF_EXCEPTION(scope, { });
    7979
    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));
    8181    RETURN_IF_EXCEPTION(scope, { });
    8282
  • trunk/Source/JavaScriptCore/wasm/js/WebAssemblyPrototype.cpp

    r223874 r223875  
    138138    auto scope = DECLARE_CATCH_SCOPE(vm);
    139139    // 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));
    141141    RETURN_IF_EXCEPTION(scope, reject(exec, scope, promise));
    142142
Note: See TracChangeset for help on using the changeset viewer.