Ignore:
Timestamp:
Feb 19, 2009, 2:51:40 PM (16 years ago)
Author:
[email protected]
Message:

2009-02-19 Gavin Barraclough <[email protected]>

Reviewed by Oliver Hunt.

Fix for x86-64. Where the JavaScriptCore text segment lies outside
a 2gb range of the heap containing JIT generated code, callbacks
from JIT code to the stub functions in Interpreter will be incorrectly
linked.

No performance impact on Sunspider, 1% regression on v8-tests,
due to a 3% regression on richards.

  • assembler/AbstractMacroAssembler.h: (JSC::AbstractMacroAssembler::Call::Call): (JSC::AbstractMacroAssembler::Jump::link): (JSC::AbstractMacroAssembler::Jump::linkTo): (JSC::AbstractMacroAssembler::CodeLocationJump::relink): (JSC::AbstractMacroAssembler::CodeLocationCall::relink): (JSC::AbstractMacroAssembler::ProcessorReturnAddress::relinkCallerToFunction): (JSC::AbstractMacroAssembler::PatchBuffer::link): (JSC::AbstractMacroAssembler::PatchBuffer::linkTailRecursive): (JSC::AbstractMacroAssembler::differenceBetween):
  • assembler/MacroAssembler.h: (JSC::MacroAssembler::tailRecursiveCall): (JSC::MacroAssembler::makeTailRecursiveCall):
  • assembler/MacroAssemblerX86.h: (JSC::MacroAssemblerX86::call):
  • assembler/MacroAssemblerX86Common.h:
  • assembler/MacroAssemblerX86_64.h: (JSC::MacroAssemblerX86_64::call): (JSC::MacroAssemblerX86_64::moveWithPatch): (JSC::MacroAssemblerX86_64::branchPtrWithPatch): (JSC::MacroAssemblerX86_64::storePtrWithPatch):
  • assembler/X86Assembler.h: (JSC::X86Assembler::jmp_r): (JSC::X86Assembler::linkJump): (JSC::X86Assembler::patchJump): (JSC::X86Assembler::patchCall): (JSC::X86Assembler::linkCall): (JSC::X86Assembler::patchAddress):
  • interpreter/Interpreter.cpp: (JSC::Interpreter::tryCTICachePutByID):
  • jit/JIT.cpp: (JSC::JIT::privateCompile): (JSC::JIT::privateCompileCTIMachineTrampolines):
  • jit/JIT.h:
  • jit/JITArithmetic.cpp: (JSC::JIT::putDoubleResultToJSNumberCellOrJSImmediate): (JSC::JIT::compileBinaryArithOp):
  • jit/JITPropertyAccess.cpp: (JSC::JIT::privateCompilePutByIdTransition): (JSC::JIT::privateCompileGetByIdSelf): (JSC::JIT::privateCompilePutByIdReplace):
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/jit/JITPropertyAccess.cpp

    r40963 r41089  
    227227
    228228    // emit a call only if storage realloc is needed
    229     if (transitionWillNeedStorageRealloc(oldStructure, newStructure)) {
     229    bool willNeedStorageRealloc = transitionWillNeedStorageRealloc(oldStructure, newStructure);
     230    if (willNeedStorageRealloc) {
    230231        pop(X86::ebx);
    231232#if PLATFORM(X86_64)
     
    257258    ret();
    258259   
    259     Jump failureJump;
    260     bool plantedFailureJump = false;
    261     if (!failureCases.empty()) {
    262         failureCases.link(this);
    263         restoreArgumentReferenceForTrampoline();
    264         failureJump = jump();
    265         plantedFailureJump = true;
    266     }
    267 
    268     void* code = m_assembler.executableCopy(m_codeBlock->executablePool());
    269     PatchBuffer patchBuffer(code);
    270 
    271     if (plantedFailureJump)
    272         patchBuffer.linkTailRecursive(failureJump, Interpreter::cti_op_put_by_id_fail);
    273 
    274     if (transitionWillNeedStorageRealloc(oldStructure, newStructure))
     260    ASSERT(!failureCases.empty());
     261    failureCases.link(this);
     262    restoreArgumentReferenceForTrampoline();
     263    Call failureCall = tailRecursiveCall();
     264
     265    void* code = m_assembler.executableCopy(m_codeBlock->executablePool());
     266    PatchBuffer patchBuffer(code);
     267
     268    patchBuffer.link(failureCall, Interpreter::cti_op_put_by_id_fail);
     269
     270    if (willNeedStorageRealloc)
    275271        patchBuffer.link(callTarget, resizePropertyStorage);
    276272   
     
    352348    ret();
    353349
    354     void* code = m_assembler.executableCopy(m_codeBlock->executablePool());
    355     PatchBuffer patchBuffer(code);
    356 
    357     patchBuffer.linkTailRecursive(failureCases1, Interpreter::cti_op_get_by_id_self_fail);
    358     patchBuffer.linkTailRecursive(failureCases2, Interpreter::cti_op_get_by_id_self_fail);
     350    Call failureCases1Call = makeTailRecursiveCall(failureCases1);
     351    Call failureCases2Call = makeTailRecursiveCall(failureCases2);
     352
     353    void* code = m_assembler.executableCopy(m_codeBlock->executablePool());
     354    PatchBuffer patchBuffer(code);
     355
     356    patchBuffer.link(failureCases1Call, Interpreter::cti_op_get_by_id_self_fail);
     357    patchBuffer.link(failureCases2Call, Interpreter::cti_op_get_by_id_self_fail);
    359358
    360359    stubInfo->stubRoutine = patchBuffer.entry();
     
    684683    ret();
    685684
     685    Call failureCases1Call = makeTailRecursiveCall(failureCases1);
     686    Call failureCases2Call = makeTailRecursiveCall(failureCases2);
     687
    686688    void* code = m_assembler.executableCopy(m_codeBlock->executablePool());
    687689    PatchBuffer patchBuffer(code);
    688690   
    689     patchBuffer.linkTailRecursive(failureCases1, Interpreter::cti_op_put_by_id_fail);
    690     patchBuffer.linkTailRecursive(failureCases2, Interpreter::cti_op_put_by_id_fail);
     691    patchBuffer.link(failureCases1Call, Interpreter::cti_op_put_by_id_fail);
     692    patchBuffer.link(failureCases2Call, Interpreter::cti_op_put_by_id_fail);
    691693
    692694    stubInfo->stubRoutine = patchBuffer.entry();
Note: See TracChangeset for help on using the changeset viewer.