Ignore:
Timestamp:
Dec 12, 2016, 9:10:30 AM (9 years ago)
Author:
[email protected]
Message:

FTL: Dumping disassembly requires that code origin is set when making polymorphic tail calls.
https://bugs.webkit.org/show_bug.cgi?id=165747

Reviewed by Filip Pizlo.

Setting the code origin needs to be done for both the fast and slow path as we might need
it when linking a polymorphic or virtual call stub.

  • ftl/FTLLowerDFGToB3.cpp:

(JSC::FTL::DFG::LowerDFGToB3::compileTailCall):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp

    r209678 r209708  
    61456145                CallSiteIndex callSiteIndex = state->jitCode->common.addUniqueCallSiteIndex(codeOrigin);
    61466146
    6147                 CallFrameShuffleData shuffleData;
    6148                 shuffleData.numLocals = state->jitCode->common.frameRegisterCount;
    6149                 shuffleData.callee = ValueRecovery::inGPR(GPRInfo::regT0, DataFormatJS);
    6150 
    6151                 for (unsigned i = 0; i < numArgs; ++i)
    6152                     shuffleData.args.append(params[1 + i].recoveryForJSValue());
    6153 
    6154                 shuffleData.setupCalleeSaveRegisters(jit.codeBlock());
    6155 
    6156                 CallLinkInfo* callLinkInfo = jit.codeBlock()->addCallLinkInfo();
    6157 
    6158                 CCallHelpers::DataLabelPtr targetToCheck;
    6159                 CCallHelpers::Jump slowPath = jit.branchPtrWithPatch(
    6160                     CCallHelpers::NotEqual, GPRInfo::regT0, targetToCheck,
    6161                     CCallHelpers::TrustedImmPtr(0));
    6162 
    6163                 callLinkInfo->setFrameShuffleData(shuffleData);
    6164                 CallFrameShuffler(jit, shuffleData).prepareForTailCall();
    6165 
    6166                 CCallHelpers::Call fastCall = jit.nearTailCall();
    6167 
    6168                 slowPath.link(&jit);
    6169 
    61706147                // Yes, this is really necessary. You could throw an exception in a host call on the
    61716148                // slow path. That'll route us to lookupExceptionHandler(), which unwinds starting
     
    61746151                    CCallHelpers::TrustedImm32(callSiteIndex.bits()),
    61756152                    CCallHelpers::tagFor(VirtualRegister(CallFrameSlot::argumentCount)));
     6153
     6154                CallFrameShuffleData shuffleData;
     6155                shuffleData.numLocals = state->jitCode->common.frameRegisterCount;
     6156                shuffleData.callee = ValueRecovery::inGPR(GPRInfo::regT0, DataFormatJS);
     6157
     6158                for (unsigned i = 0; i < numArgs; ++i)
     6159                    shuffleData.args.append(params[1 + i].recoveryForJSValue());
     6160
     6161                shuffleData.setupCalleeSaveRegisters(jit.codeBlock());
     6162
     6163                CallLinkInfo* callLinkInfo = jit.codeBlock()->addCallLinkInfo();
     6164
     6165                CCallHelpers::DataLabelPtr targetToCheck;
     6166                CCallHelpers::Jump slowPath = jit.branchPtrWithPatch(
     6167                    CCallHelpers::NotEqual, GPRInfo::regT0, targetToCheck,
     6168                    CCallHelpers::TrustedImmPtr(0));
     6169
     6170                callLinkInfo->setFrameShuffleData(shuffleData);
     6171                CallFrameShuffler(jit, shuffleData).prepareForTailCall();
     6172
     6173                CCallHelpers::Call fastCall = jit.nearTailCall();
     6174
     6175                slowPath.link(&jit);
    61766176
    61776177                CallFrameShuffler slowPathShuffler(jit, shuffleData);
Note: See TracChangeset for help on using the changeset viewer.