Ignore:
Timestamp:
May 1, 2019, 8:10:43 PM (6 years ago)
Author:
[email protected]
Message:

Baseline JIT should do argument value profiling after checking for stack overflow
https://bugs.webkit.org/show_bug.cgi?id=197052
<rdar://problem/50009602>

Reviewed by Yusuke Suzuki.

JSTests:

  • stress/check-stack-overflow-before-value-profiling-arguments.js: Added.

Source/JavaScriptCore:

Otherwise, we may do value profiling without running a write barrier, which
is against the rules of how we do value profiling.

  • jit/JIT.cpp:

(JSC::JIT::compileWithoutLinking):

File:
1 edited

Legend:

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

    r244811 r244865  
    682682#endif
    683683
     684    int frameTopOffset = stackPointerOffsetFor(m_codeBlock) * sizeof(Register);
     685    unsigned maxFrameSize = -frameTopOffset;
     686    addPtr(TrustedImm32(frameTopOffset), callFrameRegister, regT1);
     687    JumpList stackOverflow;
     688    if (UNLIKELY(maxFrameSize > Options::reservedZoneSize()))
     689        stackOverflow.append(branchPtr(Above, regT1, callFrameRegister));
     690    stackOverflow.append(branchPtr(Above, AbsoluteAddress(m_vm->addressOfSoftStackLimit()), regT1));
     691
     692    move(regT1, stackPointerRegister);
     693    checkStackPointerAlignment();
     694    if (Options::zeroStackFrame())
     695        clearStackFrame(callFrameRegister, stackPointerRegister, regT0, maxFrameSize);
     696
     697    emitSaveCalleeSaves();
     698    emitMaterializeTagCheckRegisters();
     699
    684700    if (m_codeBlock->codeType() == FunctionCode) {
    685701        ASSERT(m_bytecodeOffset == std::numeric_limits<unsigned>::max());
     
    701717        }
    702718    }
    703 
    704     int frameTopOffset = stackPointerOffsetFor(m_codeBlock) * sizeof(Register);
    705     unsigned maxFrameSize = -frameTopOffset;
    706     addPtr(TrustedImm32(frameTopOffset), callFrameRegister, regT1);
    707     JumpList stackOverflow;
    708     if (UNLIKELY(maxFrameSize > Options::reservedZoneSize()))
    709         stackOverflow.append(branchPtr(Above, regT1, callFrameRegister));
    710     stackOverflow.append(branchPtr(Above, AbsoluteAddress(m_vm->addressOfSoftStackLimit()), regT1));
    711 
    712     move(regT1, stackPointerRegister);
    713     checkStackPointerAlignment();
    714     if (Options::zeroStackFrame())
    715         clearStackFrame(callFrameRegister, stackPointerRegister, regT0, maxFrameSize);
    716 
    717     emitSaveCalleeSaves();
    718     emitMaterializeTagCheckRegisters();
    719719   
    720720    RELEASE_ASSERT(!JITCode::isJIT(m_codeBlock->jitType()));
Note: See TracChangeset for help on using the changeset viewer.