Changeset 178856 in webkit for trunk/Source/JavaScriptCore/jit


Ignore:
Timestamp:
Jan 21, 2015, 1:43:55 PM (10 years ago)
Author:
[email protected]
Message:

Eliminate Scope slot from JavaScript CallFrame
https://bugs.webkit.org/show_bug.cgi?id=136724

Reviewed by Geoffrey Garen.

This finishes the removal of the scope chain slot from the call frame header.

  • dfg/DFGOSRExitCompilerCommon.cpp:

(JSC::DFG::reifyInlinedCallFrames):

  • dfg/DFGPreciseLocalClobberize.h:

(JSC::DFG::PreciseLocalClobberizeAdaptor::readTop):

  • dfg/DFGSpeculativeJIT32_64.cpp:

(JSC::DFG::SpeculativeJIT::emitCall):

  • dfg/DFGSpeculativeJIT64.cpp:

(JSC::DFG::SpeculativeJIT::emitCall):

  • ftl/FTLJSCall.cpp:

(JSC::FTL::JSCall::emit):

  • ftl/FTLLowerDFGToLLVM.cpp:

(JSC::FTL::LowerDFGToLLVM::compileNativeCallOrConstruct):
(JSC::FTL::LowerDFGToLLVM::compileCallOrConstruct):

  • interpreter/JSStack.h:
  • interpreter/VMInspector.cpp:

(JSC::VMInspector::dumpFrame):

  • jit/JITCall.cpp:

(JSC::JIT::compileOpCall):

  • jit/JITCall32_64.cpp:

(JSC::JIT::compileOpCall):

  • jit/JITOpcodes32_64.cpp:

(JSC::JIT::privateCompileCTINativeCall):

  • jit/Repatch.cpp:

(JSC::generateByIdStub):
(JSC::linkClosureCall):

  • jit/ThunkGenerators.cpp:

(JSC::virtualForThunkGenerator):
(JSC::nativeForGenerator):
Deleted ScopeChain slot from JSStack. Removed all code where ScopeChain was being
read or set. In most cases this was where we make JS calls.

  • interpreter/CallFrameClosure.h:

(JSC::CallFrameClosure::setArgument):
(JSC::CallFrameClosure::resetCallFrame): Deleted.

  • interpreter/Interpreter.cpp:

(JSC::Interpreter::execute):
(JSC::Interpreter::executeCall):
(JSC::Interpreter::executeConstruct):
(JSC::Interpreter::prepareForRepeatCall):

  • interpreter/ProtoCallFrame.cpp:

(JSC::ProtoCallFrame::init):

  • interpreter/ProtoCallFrame.h:

(JSC::ProtoCallFrame::scope): Deleted.
(JSC::ProtoCallFrame::setScope): Deleted.

  • llint/LLIntData.cpp:

(JSC::LLInt::Data::performAssertions):

  • llint/LowLevelInterpreter.asm:
  • llint/LowLevelInterpreter64.asm:

Removed the related scopeChainValue member from ProtoCallFrame. Reduced the number of
registers that needed to be copied from the ProtoCallFrame to a callee's frame
from 5 to 4.

  • llint/LowLevelInterpreter32_64.asm:

In addition to the prior changes, also deleted the unused macro getDeBruijnScope.

Location:
trunk/Source/JavaScriptCore/jit
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/jit/JITCall.cpp

    r173282 r178856  
    178178
    179179       For a JS call:
    180         - Caller initializes ScopeChain.
    181180        - Callee initializes ReturnPC; CodeBlock.
    182181        - Callee restores callFrameRegister before return.
    183182
    184183       For a non-JS call:
    185         - Caller initializes ScopeChain; ReturnPC; CodeBlock.
     184        - Caller initializes ReturnPC; CodeBlock.
    186185        - Caller restores callFrameRegister after return.
    187186    */
     
    237236    m_callCompilationInfo[callLinkInfoIndex].callLinkInfo = info;
    238237
    239     loadPtr(Address(regT0, OBJECT_OFFSETOF(JSFunction, m_scope)), regT2);
    240     store64(regT2, Address(MacroAssembler::stackPointerRegister, JSStack::ScopeChain * sizeof(Register) - sizeof(CallerFrameAndPC)));
    241 
    242238    m_callCompilationInfo[callLinkInfoIndex].hotPathOther = emitNakedCall();
    243239
  • trunk/Source/JavaScriptCore/jit/JITCall32_64.cpp

    r173282 r178856  
    265265
    266266       For a JS call:
    267         - Caller initializes ScopeChain.
    268267        - Callee initializes ReturnPC; CodeBlock.
    269268        - Callee restores callFrameRegister before return.
    270269
    271270       For a non-JS call:
    272         - Caller initializes ScopeChain; ReturnPC; CodeBlock.
     271        - Caller initializes ReturnPC; CodeBlock.
    273272        - Caller restores callFrameRegister after return.
    274273    */
     
    328327    m_callCompilationInfo[callLinkInfoIndex].callLinkInfo = info;
    329328
    330     loadPtr(Address(regT0, OBJECT_OFFSETOF(JSFunction, m_scope)), regT2);
    331     store32(regT2, Address(MacroAssembler::stackPointerRegister, JSStack::ScopeChain * sizeof(Register) + PayloadOffset - sizeof(CallerFrameAndPC)));
    332     store32(TrustedImm32(JSValue::CellTag), Address(stackPointerRegister, JSStack::ScopeChain * sizeof(Register) + TagOffset - sizeof(CallerFrameAndPC)));
    333 
    334329    checkStackPointerAlignment();
    335330    m_callCompilationInfo[callLinkInfoIndex].hotPathOther = emitNakedCall();
  • trunk/Source/JavaScriptCore/jit/JITOpcodes32_64.cpp

    r178143 r178856  
    5858
    5959#if CPU(X86)
    60     // Load caller frame's scope chain into this callframe so that whatever we call can
    61     // get to its global data.
    62     emitGetCallerFrameFromCallFrameHeaderPtr(regT0);
    63     emitGetFromCallFrameHeaderPtr(JSStack::ScopeChain, regT1, regT0);
    64     emitPutCellToCallFrameHeader(regT1, JSStack::ScopeChain);
    65 
    6660    // Calling convention:      f(ecx, edx, ...);
    6761    // Host function signature: f(ExecState*);
     
    7771
    7872#elif CPU(ARM) || CPU(SH4) || CPU(MIPS)
    79     // Load caller frame's scope chain into this callframe so that whatever we call can get to its global data.
    80     emitGetCallerFrameFromCallFrameHeaderPtr(regT2);
    81     emitGetFromCallFrameHeaderPtr(JSStack::ScopeChain, regT1, regT2);
    82     emitPutCellToCallFrameHeader(regT1, JSStack::ScopeChain);
    83 
    8473#if CPU(MIPS)
    8574    // Allocate stack space for (unused) 16 bytes (8-byte aligned) for 4 arguments.
  • trunk/Source/JavaScriptCore/jit/Repatch.cpp

    r178756 r178856  
    512512                MacroAssembler::TrustedImmPtr(0));
    513513           
    514             // loadedValueGPR is already burned. We can reuse it. From here on we assume that
    515             // any volatile register will be clobbered anyway.
    516             stubJit.loadPtr(
    517                 MacroAssembler::Address(loadedValueGPR, JSFunction::offsetOfScopeChain()),
    518                 loadedValueGPR);
    519             stubJit.storeCell(
    520                 loadedValueGPR, calleeFrame.withOffset(JSStack::ScopeChain * sizeof(Register)));
    521514            fastPathCall = stubJit.nearCall();
    522515           
     
    16861679            CCallHelpers::TrustedImmPtr(executable)));
    16871680   
    1688     stubJit.loadPtr(
    1689         CCallHelpers::Address(calleeGPR, JSFunction::offsetOfScopeChain()),
    1690         GPRInfo::returnValueGPR);
    1691    
    1692 #if USE(JSVALUE64)
    1693     stubJit.store64(
    1694         GPRInfo::returnValueGPR,
    1695         CCallHelpers::Address(MacroAssembler::stackPointerRegister, static_cast<ptrdiff_t>(sizeof(Register) * JSStack::ScopeChain) + offsetToFrame));
    1696 #else
    1697     stubJit.storePtr(
    1698         GPRInfo::returnValueGPR,
    1699         CCallHelpers::Address(MacroAssembler::stackPointerRegister, static_cast<ptrdiff_t>(sizeof(Register) * JSStack::ScopeChain) + OBJECT_OFFSETOF(EncodedValueDescriptor, asBits.payload) + offsetToFrame));
    1700     stubJit.store32(
    1701         CCallHelpers::TrustedImm32(JSValue::CellTag),
    1702         CCallHelpers::Address(MacroAssembler::stackPointerRegister, static_cast<ptrdiff_t>(sizeof(Register) * JSStack::ScopeChain) + OBJECT_OFFSETOF(EncodedValueDescriptor, asBits.tag) + offsetToFrame));
    1703 #endif
    1704    
    17051681    AssemblyHelpers::Call call = stubJit.nearCall();
    17061682    AssemblyHelpers::Jump done = stubJit.jump();
  • trunk/Source/JavaScriptCore/jit/ThunkGenerators.cpp

    r175243 r178856  
    215215    // call.
    216216   
    217     jit.loadPtr(
    218         CCallHelpers::Address(GPRInfo::regT0, JSFunction::offsetOfScopeChain()),
    219         GPRInfo::regT1);
    220 #if USE(JSVALUE64)
    221     jit.emitPutToCallFrameHeaderBeforePrologue(GPRInfo::regT1, JSStack::ScopeChain);
    222 #else
    223     jit.emitPutPayloadToCallFrameHeaderBeforePrologue(GPRInfo::regT1, JSStack::ScopeChain);
    224     jit.emitPutTagToCallFrameHeaderBeforePrologue(CCallHelpers::TrustedImm32(JSValue::CellTag),
    225         JSStack::ScopeChain);
    226 #endif
    227    
    228217    // Make a tail call. This will return back to JIT code.
    229218    emitPointerValidation(jit, GPRInfo::regT4);
     
    277266
    278267#if CPU(X86)
    279     // Load callee's scope chain into this callframe so that whatever we call can
    280     // get to its global data.
    281     jit.emitGetFromCallFrameHeaderPtr(JSStack::Callee, JSInterfaceJIT::regT1);
    282     jit.loadPtr(JSInterfaceJIT::Address(JSInterfaceJIT::regT1, JSCallee::offsetOfScopeChain()), JSInterfaceJIT::regT1);
    283     jit.emitPutCellToCallFrameHeader(JSInterfaceJIT::regT1, JSStack::ScopeChain);
    284 
    285268    // Calling convention:      f(ecx, edx, ...);
    286269    // Host function signature: f(ExecState*);
     
    297280
    298281#elif CPU(X86_64)
    299     // Load callee's scope chain into this callframe so that whatever we call can
    300     // get to its global data.
    301     jit.emitGetFromCallFrameHeaderPtr(JSStack::Callee, JSInterfaceJIT::regT1);
    302     jit.loadPtr(JSInterfaceJIT::Address(JSInterfaceJIT::regT1, JSCallee::offsetOfScopeChain()), JSInterfaceJIT::regT1);
    303     jit.emitPutCellToCallFrameHeader(JSInterfaceJIT::regT1, JSStack::ScopeChain);
    304282#if !OS(WINDOWS)
    305283    // Calling convention:      f(edi, esi, edx, ecx, ...);
     
    334312    COMPILE_ASSERT(ARM64Registers::x2 != JSInterfaceJIT::regT3, T3_not_trampled_by_arg_2);
    335313
    336     // Load callee's scope chain into this callframe so that whatever we call can
    337     // get to its global data.
    338     jit.emitGetFromCallFrameHeaderPtr(JSStack::Callee, JSInterfaceJIT::regT1);
    339     jit.loadPtr(JSInterfaceJIT::Address(JSInterfaceJIT::regT1, JSCallee::offsetOfScopeChain()), JSInterfaceJIT::regT1);
    340     jit.emitPutCellToCallFrameHeader(JSInterfaceJIT::regT1, JSStack::ScopeChain);
    341 
    342314    // Host function signature: f(ExecState*);
    343315    jit.move(JSInterfaceJIT::callFrameRegister, ARM64Registers::x0);
     
    347319    jit.call(JSInterfaceJIT::Address(ARM64Registers::x2, executableOffsetToFunction));
    348320#elif CPU(ARM) || CPU(SH4) || CPU(MIPS)
    349     // Load callee's scope chain into this callframe so that whatever we call can
    350     // get to its global data.
    351     jit.emitGetFromCallFrameHeaderPtr(JSStack::Callee, JSInterfaceJIT::regT1);
    352     jit.loadPtr(JSInterfaceJIT::Address(JSInterfaceJIT::regT1, JSCallee::offsetOfScopeChain()), JSInterfaceJIT::regT1);
    353     jit.emitPutCellToCallFrameHeader(JSInterfaceJIT::regT1, JSStack::ScopeChain);
    354 
    355321#if CPU(MIPS)
    356322    // Allocate stack space for (unused) 16 bytes (8-byte aligned) for 4 arguments.
Note: See TracChangeset for help on using the changeset viewer.